Spring Boot 统一处理参数校验结果 JSR303 @Valid BindingResult MethodArgumentNotValidException

使用@ControllerAdvice统一处理参数校验的结果, 而不再使用BindingResult在Controller中处理


import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


@RestControllerAdvice
@Slf4j
public class ExceptionAdvice {

    @ExceptionHandler(BindException.class)
    public Object validExceptionHandler(BindException e){
        FieldError fieldError = e.getBindingResult().getFieldError();
        assert fieldError != null;
        log.error(fieldError.getField() + ":" + fieldError.getDefaultMessage());
        // 将错误的参数的详细信息封装到统一的返回实体
        ...
        return ...;
    }
}


感觉一下就方便不少,
但是, 如果你使用了@RequestBody @Valid 来封装参数并校验, 这个时候这个异常处理器又不起作用了...

{
    "timestamp": "2018-09-17T07:27:36.152+0000",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [
                "NotNull.person.id",
                "NotNull.id",
                "NotNull.java.lang.Integer",
                "NotNull"
            ],
            "arguments": [
                {
                    "codes": [
                        "person.id",
                        "id"
                    ],
                    "arguments": null,
                    "defaultMessage": "id",
                    "code": "id"
                }
            ],
            "defaultMessage": "不能为null",
            "objectName": "person",
            "field": "id",
            "rejectedValue": null,
            "bindingFailure": false,
            "code": "NotNull"
        }
    ],
    "message": "Validation failed for object='person'. Error count: 1",
    "path": "/post"
}

再添加一个异常处理器, 问题解决

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object validExceptionHandler(MethodArgumentNotValidException e){
        FieldError fieldError = e.getBindingResult().getFieldError();
        assert fieldError != null;
        log.error(fieldError.getField() + ":" + fieldError.getDefaultMessage());
        ...
        return ...;
    }

具体原因: https://jira.spring.io/browse/SPR-10157

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,537评论 1 92
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,953评论 6 342
  • 山头味系列 【山头味】之三合社 选料:三合社古树纯料 海拔:1058m 叶种:大叶种 口感特点:易武茶共同的特点香...
    写一个世界的阅读 477评论 0 0
  • (今天这个不算故事吧,随笔?我也不知道该怎样定义) 曾经梦想的生活就是归隐山林,一间茅草屋,有山有水有树林,养...
    shanene华阅读 232评论 2 1