Spring Boot 統一處理參數校驗結果 JSR303 @Valid BindingResult MethodArgumentNotValidExcepti

使用@ControllerAdvice統一處理參數校驗的結果, 而再也不使用BindingResult在Controller中處理java

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 來封裝參數並校驗, 這個時候這個異常處理器又不起做用了...web

{
    "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"
}
複製代碼

再添加一個異常處理器, 問題解決spring

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

具體緣由: jira.spring.io/browse/SPR-…json

相關文章
相關標籤/搜索