使用@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