ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-19 19:02:33  阅读:239  来源: 互联网

标签:lang Ambiguous java getBindingResult 错误信息 Objects MethodArgumentNotValidExceptio


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     }

标签:lang,Ambiguous,java,getBindingResult,错误信息,Objects,MethodArgumentNotValidExceptio
来源: https://www.cnblogs.com/brokencolor/p/16289718.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有