@RestControllerAdvice注解使用
在spring 3.2中,新增了@ControllerAdvice,@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考帮助文档。@RestControllerAdvice 是组件注解,他使得其实现类能够被classpath扫描自动发现,如果应用是通过MVC命令空间或MVC Java编程方式配置,那么该特性默认是自动开启的。
主要配合@ExceptionHandler使用,统一处理异常情况。下面的ResponseEntity、ResponseData 都是项目自定义的返回对象。
import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /** * 处理运行异常 */ @ExceptionHandler(RuntimeException.class) public ResponseEntity<String> handleRuntimeException(HttpServletRequest request, RuntimeException ex) { log.error("", ex);
log.error("请求地址:" + request.getRequestURL());
log.error("请求参数: " + JSONUtil.toJsonStr(request.getParameterMap())); return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST); } /** * 用来捕获404,400这种无法到达controller的错误 * * @param ex * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) public ResponseData defaultErrorHandler(Exception ex) throws Exception { log.error("", ex); ResponseData<Object> result = new ResponseData<Object>(); result.setMessage(ex.getMessage()); if (ex instanceof NoHandlerFoundException) { result.setCode("404"); } else { result.setCode("500"); } result.setData(null); result.setSuccess(false); return result; } }
补充:同时定义2套ExceptionHandler
需求:原项目是根据一个SpringBoot开源项目改造来的,返回对象只满足前端使用,后来改成SpringCloud项目后,项目使用Feign相互调用时,再用原来那套返回对象就不好用了,只能接收到一个Http状态码,描述信息都收不到。因为之前已经有一个全局的GlobalExceptionHandler了,所以要在做一个套给Feign使用的ExceptionHandler,换个更适合的返回对象。
代码如下:
@RestControllerAdvice(basePackageClasses = {com.ucap.zh.controller.ApiController.class}) @Order(Ordered.HIGHEST_PRECEDENCE) public class ApiExceptionHandler { }
@RestControllerAdvice注解使用了basePackageClasses指定了为Feign提供接口的ApiController类,说明此ExceptionHandler只作用到这个Controller,对其他无效。
@Order(Ordered.HIGHEST_PRECEDENCE) 顺序注解,要提高此ExceptionHandler的执行顺序,必须在全局的GlobalExceptionHandler之前执行,如果此ExceptionHandler定义的异常未拦截成功,在走GlobalExceptionHandler
@RestControllerAdvice
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」