前言
今天在get請求上使用注解進行參數校驗,怎么樣都校驗不到,把解決過程記錄一下。
正文
解決方法 :
- 在類上面增加 @Validated 注解
- 修改方法訪問權限為 public (我就栽在這里了,之前的接口在接手的時候使用的private修飾的)
這時就可以正常使用@NotNull 等各種校驗注解了。
其它
需要注意的是這里校驗失敗時對外拋錯是ConstraintViolationException(post請求對實體進行校驗的拋錯是MethodArgumentNotValidException)。
所以需要我們對兩個拋錯都進行處理。
/**
* 處理參數校驗異常
* @param e
* @return
*/
@ExceptionHandler({MethodArgumentNotValidException.class})
public CustomizeResponse exception(MethodArgumentNotValidException e) {
logger.error(e.getMessage(), e);
CustomizeResponse result = new CustomizeResponse();
//result.setCode("");
if(null != e.getBindingResult() && null != e.getBindingResult().getAllErrors() && !(e.getBindingResult().getAllErrors().isEmpty())){
String errorMsg = e.getBindingResult().getAllErrors()
.stream()
.map(objectError -> ((FieldError)objectError).getField() + ((FieldError)objectError).getDefaultMessage())
.collect(Collectors.joining(","));
if(null != errorMsg && !"".equals(errorMsg)){
result.setMessage(errorMsg);
}
}
return result;
}
/**
* 處理參數校驗異常(這個是處理方法校驗的,用於get請求校驗)
* @param e
* @return
*/
@ExceptionHandler({ConstraintViolationException.class})
public CustomizeResponse validateException(ConstraintViolationException e) {
logger.error(e.getMessage(), e);
CustomizeResponse result = new CustomizeResponse();
//result.setCode("");
if(null != e.getConstraintViolations() && !e.getConstraintViolations().isEmpty()){
String errorMsg = e.getConstraintViolations()
.stream()
.map(objectError -> objectError.getMessage())
.collect(Collectors.joining(","));
if(null != errorMsg && !"".equals(errorMsg)){
result.setMessage(errorMsg);
}
}
return result;
}