Bean Validation是目前用的最多的验证工具,因为是运行时数据验证框架,在验证之后验证的错误信息会被马上返回。但有时候验证的错误信息,每次都要进行判断,是否有错,然后组合成项目中对应的数据模型,返回前端。这样比较麻烦。这也是本文要解决的问题。
@RequestMapping(value = "/plan", method = RequestMethod.POST)
public Result<List> getAttePlanTimeSlot(@Valid @RequestBody PageSearchVo pageSearchVo, BindingResult bindingResult) {
//这里每个有验证的接口都要进行判断,比较麻烦
if (bindingResult.hasErrors()) {
return Result.ofParamsError(bindingResult.getFieldError().getDefaultMessage());
}
return Result.ofSuccess(new ArrayList<>());
}
解决的办法就是重写 继承ResponseEntityExceptionHandler,重写 handleMethodArgumentNotValid 方法,该方法主要是数据校验出错时调用,重写该方法,统一组装返回。
/**
* Created by zhangshukang on 2017/12/26.
*
* 参数校验,报错信息处理类
*
*/
@ControllerAdvice
@Slf4j
public class BadRequestExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
IybBaseResponse response = new IybBaseResponse();
response.setCode(ErrorCodeEnum.CMN_ILLEGAL_ARG.getCode ());
String message = "";
BindingResult result = ex.getBindingResult();
//组装校验错误信息
if(result.hasErrors()){
List<ObjectError> list = result.getAllErrors();
StringBuffer errorMsgBuffer = new StringBuffer();
for(ObjectError error:list){
if (error instanceof FieldError) {
FieldError errorMessage = (FieldError) error;
errorMsgBuffer = errorMsgBuffer.append(errorMessage.getDefaultMessage()+",");
}
}
//返回信息格式处理
message = errorMsgBuffer.toString().substring(0,errorMsgBuffer.length()-1);
}
response.setMessage(message);
return new ResponseEntity<>(response, headers, status);
}
}
这种方式比较灵活,handleMethodArgumentNotValid
起到了拦截的作用,前提是数据校验抛异常之后才会执行到这里
适合全局的校验处理。如果想单独处理错误信息,还是上面接口中用bindingResult
处理。