☰
SpringBoot_03_Web开发
2026/9/27 1:34:08 网站建设 项目流程

【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、@Email、@Min等注解,Controller 参数加@Valid触发校验。校验失败抛出MethodArgumentNotValidException,由全局异常处理器统一处理。


九、总结

功能核心类/注解要点
RESTful API@RestController标准 CRUD 接口
统一响应Result 封装success() / error()
全局异常@RestControllerAdvice@ExceptionHandler
拦截器HandlerInterceptoraddInterceptors
跨域addCorsMappings全局/局部配置
参数校验@Valid + 注解@NotBlank, @Email, @Min

💡下一篇:《Spring Boot 数据层整合》,详解 MyBatis 整合、事务管理与 Actuator 监控。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询