【Spring Boot】Web 开发:RESTful API、拦截器与全局异常处理
🔑关键词:Java、Spring Boot、Web开发、RESTful、拦截器、全局异常、跨域CORS
一、Spring Boot Web 开发基础
引入spring-boot-starter-web后自动包含:Spring MVC、内嵌 Tomcat、Jackson。
@RestController@RequestMapping("/api/users")publicclassUserController{@AutowiredprivateUserServiceuserService;@GetMappingpublicList<User>list(){returnuserService.findAll();}@GetMapping("/{id}")publicUsergetById(@PathVariableLongid){returnuserService.findById(id);}@PostMappingpublicUsercreate(@RequestBodyUseruser){returnuserService.save(user);}@PutMapping("/{id}")publicUserupdate(@PathVariableLongid,@RequestBodyUseruser){user.setId(id);returnuserService.update(user);}@DeleteMapping("/{id}")publicvoiddelete(@PathVariableLongid){userService.deleteById(id);}}二、统一响应格式
publicclassResult<T>{privateintcode;privateStringmessage;privateTdata;privateResult(intcode,Stringmessage,Tdata){this.code=code;this.message=message;this.data=data;}publicstatic<T>Result<T>success(Tdata){returnnewResult<>(200,"success",data);}publicstatic<T>Result<T>error(intcode,Stringmessage){returnnewResult<>(code,message,null);}}使用:
@GetMapping("/{id}")publicResult<User>getById(@PathVariableLongid){returnResult.success(userService.findById(id));// 响应:{"code":200,"message":"success","data":{...}}}三、全局异常处理
3.1 @RestControllerAdvice
@RestControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(BusinessException.class)publicResult<?>handleBusinessException(BusinessExceptione){returnResult.error(e.getCode(),e.getMessage());}@ExceptionHandler(MethodArgumentNotValidException.class)publicResult<?>handleValidException(MethodArgumentNotValidExceptione){Stringmsg=e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining("; "));returnResult.error(400,msg);}@ExceptionHandler(Exception.class)publicResult<?>handleException(Exceptione){e.printStackTrace();returnResult.error(500,"服务器内部错误");}}3.2 自定义业务异常
publicclassBusinessExceptionextendsRuntimeException{privateintcode;publicBusinessException(intcode,Stringmessage){super(message);this.code=code;}publicintgetCode(){returncode;}}// 使用publicUserfindById(Longid){Useruser=userMapper.selectById(id);if(user==null){thrownewBusinessException(404,"用户不存在");}returnuser;}四、拦截器
@ComponentpublicclassAuthInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Stringtoken=request.getHeader("Authorization");if(token==null||token.isEmpty()){response.setStatus(401);response.setContentType("application/json;charset=UTF-8");response.getWriter().write("{\"code\":401,\"message\":\"未登录\"}");returnfalse;}returntrue;}}注册:
@ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{@AutowiredprivateAuthInterceptorauthInterceptor;@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(authInterceptor).addPathPatterns("/api/**").excludePathPatterns("/api/login","/api/register");}}五、跨域处理(CORS)
5.1 全局配置(推荐)
@ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("GET","POST","PUT","DELETE","OPTIONS").allowedHeaders("*").allowCredentials(true).maxAge(3600);}}5.2 局部配置
@RestController@CrossOrigin(origins="http://localhost:3000")publicclassUserController{}六、参数校验
引入依赖spring-boot-starter-validation,在 DTO 上使用校验注解:
publicclassUserDTO{@NotBlank(message="用户名不能为空")@Size(min=2,max=20,message="用户名长度2-20")privateStringusername;@Email(message="邮箱格式不正确")privateStringemail;@Min(value=1,message="年龄最小为1")@Max(value=150,message="年龄最大为150")privateIntegerage;}// Controller 中加 @Valid 触发校验@PostMappingpublicResult<User>create(@RequestBody@ValidUserDTOdto){returnResult.success(userService.save(dto));}// 校验失败自动抛出 MethodArgumentNotValidException,由全局异常处理器处理七、WebMvcConfigurer 常用方法汇总
@ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){}// 拦截器@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){}// 跨域@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){}// 静态资源@OverridepublicvoidaddViewControllers(ViewControllerRegistryregistry){}// 视图控制器@OverridepublicvoidaddFormatters(FormatterRegistryregistry){}// 日期格式化}八、面试高频问题
Q1:Spring Boot 中如何实现跨域?
答:实现
WebMvcConfigurer,重写addCorsMappings方法。可以全局配置(推荐)或使用@CrossOrigin注解局部配置。核心设置allowedOriginPatterns、allowedMethods、allowedHeaders。
Q2:@RestControllerAdvice 和 @ControllerAdvice 的区别?
答:
@ControllerAdvice需配合@ResponseBody才能返回 JSON;@RestControllerAdvice=@ControllerAdvice+@ResponseBody,直接返回 JSON。Spring Boot 项目推荐用@RestControllerAdvice。
Q3:Spring Boot 的参数校验怎么用?
答:引入
spring-boot-starter-validation,DTO 字段使用@NotBlank、@Min等注解,Controller 参数加@Valid触发校验。校验失败抛出MethodArgumentNotValidException,由全局异常处理器统一处理。
九、总结
| 功能 | 核心类/注解 | 要点 |
|---|---|---|
| RESTful API | @RestController | 标准 CRUD 接口 |
| 统一响应 | Result 封装 | success() / error() |
| 全局异常 | @RestControllerAdvice | @ExceptionHandler |
| 拦截器 | HandlerInterceptor | addInterceptors |
| 跨域 | addCorsMappings | 全局/局部配置 |
| 参数校验 | @Valid + 注解 | @NotBlank, @Email, @Min |
💡下一篇:《Spring Boot 数据层整合》,详解 MyBatis 整合、事务管理与 Actuator 监控。