SpringBoot项目中@RestControllerAdvice全局异常失效问题的解决
作者:Eric-x
@RestController注解是一个用于定义RESTful Web服务的控制器的特殊注解,它是@Controller和@ResponseBody注解的结合体,意味着你不需要在每个处理请求的方法上都添加@ResponseBody,本文给大家介绍了解决SpringBoot项目中@RestControllerAdvice全局异常失效问题
1、问题
使用@RestControllerAdvice添加了全局异常,但没有生效
/** * 全局异常处理 * @author Eric * @date 2022-10-08 10:00:22 */ @RestControllerAdvice public class ExceptionControllerAdvice { private static final Logger logger = LoggerFactory.getLogger(WxRedpackController.class); /** * 用来拦截valid的校验 * @param e * @return */ @ExceptionHandler(value = MethodArgumentNotValidException.class) public Object handleVaildException(MethodArgumentNotValidException e) { logger.info("数据校验出现问题:{},异常类型:{}", e.getMessage(), e.getClass()); BindingResult result = e.getBindingResult(); if (result.hasErrors()) { Map<String, String> errorMap = new HashMap<>(); result.getFieldErrors().forEach((item) -> { //获取到的错误提示 String message = item.getDefaultMessage(); //获取到的错误属性名称 String field = item.getField(); errorMap.put(field, message); }); return ResponseUtil.fail(DATA_ERROR.code(),errorMap); } return ResponseUtil.fail(); } /** * 拦截未知的运行时异常 */ @ExceptionHandler(RuntimeException.class) public Object notFount(RuntimeException e) { logger.info("运行时异常:", e); return ResponseUtil.fail(DATA_ERROR.code(),e.getMessage()); } /** * 系统异常 */ @ExceptionHandler(Exception.class) public Object handleException(Exception e) { logger.info(e.getMessage(), e); return ResponseUtil.fail(DATA_ERROR.code(),"服务器网络拥堵,请稍后再试"); } }
2、解决
方式1:@ExceptionHandler 所在类没有被Spring管理
因为 @SpringbootApplication默认扫描本包和子包,为了防止 全局异常类未被扫描到,建议在启动类上加上包扫描
方式2:AOP process() 没有异常抛出,自然不会被拦截掉。检查项目中的切面编程,查看是否在某个切面将异常try-catch,然后没有扔出来。
方式3:在@RestControllerAdvice @ConrollerAdivce 所在的类使用@Order(999999),注意这里不要引用错误的包了了,org.springframework.core.annotation.Order
到此这篇关于SpringBoot项目中@RestControllerAdvice全局异常失效问题的解决的文章就介绍到这了,更多相关SpringBoot @RestController异常失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!