前言
对于日常开发来说,参数校验对于项目是必不可少的,为了避免大量使用if语句判断故而使用注解的形式进行参数校验
导入相关依赖
<!-- 说明:springboot 2.0+ spring-boot-web内部引入了Hibernate包 高版本是没有的
当然,springboot也有整合Hibernate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.6.Final</version>
</dependency>
<!-- 这个可以不用导入,因为Hibernate内部已经引入了该依赖包 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
springboot整合Hibernate-validator
配置
@Configuration
@EnableAutoConfiguration
public class ValidatorConfig {
/**
* 快速失败返回模式,默认是普通模式
* @return
*/
@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;
}
}
定义参数校验失败的异常处理
/**
* 对于参数校验失败统一异常处理
*/
@RestControllerAdvice
public class WebExceptionHandler {
/**
* 参数验证异常(前端json格式提交)
* 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ServerResponse MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
//验证post请求的参数合法性
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return ServerResponse.createByErrorMessage(message);
}
//处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
public ServerResponse ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return ServerResponse.createByErrorMessage(message);
}
/**
* 参数验证异常(前端form表单格式提交)
* @param e
* @return
*/
@ExceptionHandler(BindException.class)
public ServerResponse handleBindException(BindException e) {
// 得到第一个字段的错误信息
// String msg = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
String msg = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return ServerResponse.createByErrorMessage(msg);
}
}
这样就可以使用了!!!