SpringMVC | 统一处理Bean Validation校验错误信息


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处理。

猜你喜欢

转载自blog.csdn.net/woshilijiuyi/article/details/78905323