【SpringBoot】:springboot+hibernate-validator 优雅的进行参数校验

前言

对于日常开发来说,参数校验对于项目是必不可少的,为了避免大量使用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);
    }

}

这样就可以使用了!!!

参考

  1. 文章

Guess you like

Origin blog.csdn.net/weixin_45511500/article/details/118399929