使用步骤
再controller层中方法对象添加@valid @RequestBody
再验证实体类中添加@Data 其中属性不能大写开头
Springboot配置捕捉validate校验参数异常统一处理并自定义validate校验返回格式
1、添加一个异常处理类
@ControllerAdvice
public class WebExceptionHandler {
/**
* 处理请求参数格式错误 @RequestBody上使用@Valid 实体上使用@NotNull等,验证失败后抛出的异常是MethodArgumentNotValidException异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JsonData MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),message);
}
/**
* 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public JsonData BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),message);
}
/**
* 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException
*/
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public JsonData ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),message);
}
/**
* 参数格式异常
*/
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public JsonData HttpMessageNotReadableExceptionHandler(HttpMessageNotReadableException e) {
return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),"参数格式异常");
}
}
二、配置校验快速失败:只要出现校验失败的情况,就结束校验,不再进行后续的校验
/**
* validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数
* 通过这个配置改成:校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验
*/
@Configuration
public class WebConfig {
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
//failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
}