• java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for


    1.背景

    项目中使用 javax.validation.Valid 添加接口参数校验,在 VObean中添加 @NotBlank ,

    当VObean中校验通过时,都为正常;

    当VObean中 @NotBlank 校验不通过时,接口(状态400)没有返回信息;

     于是我在原来的全局异常处理添加了一个处理 如下:

     1 @RestControllerAdvice
     2 public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
     3 
     4     @ExceptionHandler(MethodArgumentNotValidException.class)
     5     public Result handleValidException(MethodArgumentNotValidException e){
     6                 //日志记录错误信息
     7                 log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
     8                 //将错误信息返回给前台
     9                 return Result.error(103, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
    10     }
    11 
    12 }

    启动项目报错:java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]

    简单理解:异常堆栈标明,重复定义了异常拦截。

    但是我这里只有这个拦截为什么重复呢?

    然后发现 这个异常拦截继承ResponseEntityExceptionHandler 这个类里集成很多异常拦截,其中就包括MethodArgumentNotValidException

     拦截到这个异常之后的处理:把状态修改为400,就返回了,所以导致 我们想要的校验错误信息没有返回

    2.解决方案

    1.保留自己定义的异常拦截器,不再继承 ResponseEntityExceptionHandler

    2.删除自己定义的异常拦截器,重写 ResponseEntityExceptionHandler.handleMethodArgumentNotValid方法

    1 protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    2         //日志记录错误信息
    3         logger.error(Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage());
    4         //将错误信息返回给前台
    5         return new ResponseEntity(Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage(), headers, status);
    6     }
  • 相关阅读:
    数据科学工作者(Data Scientist) 的日常工作内容包括什么
    Python中的startswith和endswith函数使用实例
    Python中的startswith和endswith函数使用实例
    简单制作 OS X Yosemite 10.10 正式版U盘USB启动安装盘方法教程
    error splicing file: file too large解决方法
    Django authentication 使用方法
    什么是mixin
    Python: 什么是*args和**kwargs
    django migration使用指南
    python如何获取某模块的版本信息
  • 原文地址:https://www.cnblogs.com/brokencolor/p/16289718.html
Copyright © 2020-2023  润新知