Spring boot restful api 方法参数 BindException 异常处理

BindException位于org.springframework.validation

客户端 发起接口请求,Controller在接收的参数在进行绑定注解校验规则时出现异常,会抛出  BindException 异常,可以按照如下的方式处理

1、方法参数中增加 BindingResult 参数,通过 bindingResult.hasErrors()  判断是否出错,然后做相应的业务处理

@PostMapping("/user")
@ResponseBody
public void postUser(@Valid @RequestBody User user, BindingResult bindingResult){
    //如果验证通不过的处理
    if(bindingResult.hasErrors()){
        //打印错误
        System.out.println("提示:"+bindingResult.getFieldError().getDefaultMessage());
    }
}

2、配置全局异常处理类

### 关于 SpringBoot 全局异常处理器无法捕获 400 Bad Request 参数转换失败的原因 在 Spring Boot 中,全局异常处理器通过 `@RestControllerAdvice` 和 `@ExceptionHandler` 实现,可以有效地捕获并处理大多数运行时异常。然而,在某些情况下,特定的 HTTP 错误(如 400 Bad Request)可能不会被自定义的全局异常处理器捕获。 #### 原因分析 1. **默认行为覆盖** 当发生参数绑定或验证失败时,Spring 默认会抛出 `MethodArgumentNotValidException` 或其他类似的异常类型(如 `BindException`)。这些异常会被内置的异常解析器捕获,并自动映射为 HTTP 状态码 400 (Bad Request)[^3]。由于这种默认行为的存在,自定义的全局异常处理器可能未配置针对此类异常的具体处理逻辑,从而导致未能拦截该异常。 2. **异常类型不匹配** 如果全局异常处理器仅声明了通用的 `Exception.class` 而未显式注册更具体的子类异常(例如 `MethodArgumentNotValidException`, `HttpMessageConversionException`),则可能导致部分特殊场景下的异常无法被捕获[^5]。具体来说,对于参数转换失败的情况,通常涉及到的是 `TypeMismatchException` 或者 `HttpMessageNotReadableException` 这些更加细化的异常类别。 3. **AOP 切入点限制** 使用 AOP 技术实现的全局异常管理依赖于代理对象对目标方法调用链路中的异常进行截取。但是,如果某个操作发生在框架内部而非实际业务代码层面,则有可能超出切入点范围之外而不受监控[^4]。比如 RESTful API 接收 JSON 数据过程中发生的序列化/反序列化错误就属于这种情况之一。 #### 解决方案建议 为了能够成功捕获上述提到的各种形式的 400 类型错误及其关联信息,可以在现有基础上做如下改进: - 添加专门用于应对参数校验失败情形的方法签名: ```java @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<?> handleValidationExceptions( MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach((error) ->{ String fieldName = ((FieldError) error).getField(); String errorMessage = error.getDefaultMessage(); errors.put(fieldName, errorMessage); }); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } ``` - 同样地,也需要考虑加入额外的支持以适配其它潜在触发条件下的异常种类: ```java @ExceptionHandler({HttpMessageNotReadableException.class}) protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex){ return buildErrorResponse(ex,"Invalid input data.",HttpStatus.BAD_REQUEST); } private ResponseEntity<Object> buildErrorResponse(Exception ex,String message,HttpStatus status){ ErrorDetails errorDetail=new ErrorDetails(new Date(),message, ex.toString()); return new ResponseEntity<>(errorDetail,status); } ``` 以上两段示例展示了如何分别针对表单字段验证失误以及非法请求体内容这两种常见情况作出反应的方式[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值