• springboot使用hibernate validator校验


    hibernate validator Bean验证器在开发中常用,这里我们说说它在springboot中的使用

    第一步:引入配置

    @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor() {
            MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
            /**设置validator模式为快速失败返回*/
            postProcessor.setValidator(validator());
            return postProcessor;
        }
    
        @Bean
        public Validator validator(){
            //hibernate.validator.fail_fast=false 设置为普通模式返回
            //hibernate.validator.fail_fast=true 设置为快速模式返回
            ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
                    .configure()
                    .addProperty("hibernate.validator.fail_fast", "false" )
                    .buildValidatorFactory();
            Validator validator = validatorFactory.getValidator();
            return validator;
        }

    它有两种模式返回,一种普通模式,就是所有的属性都要验证,并把错误信息返回,其余一种是快速模式,这种模式是遇到错误就返回,剩下的就不检查了。

    第二步:就是使用的问题了

    我们使用有两种情况,就是传参的时候我们会传入一个Bean对象或者是单个参数,此时我们处理就分两种情况了。

    我们首先看传Bean对象,此时怎么处理。

    先建个Bean对象:

    import lombok.Data;
    import org.hibernate.validator.constraints.NotBlank;
    
    import javax.validation.Valid;
    import javax.validation.constraints.NotNull;
    
    /**
     * 我们定义个bean、
     * Created by mingge on 2018/5/24.
     */
    @Data
    public class NewInfoParam {
    
        @NotNull(message = "ID不能为空")
        private Long id;
    
        @NotBlank(message = "名字不能为空")
        private String name;
    }

    然后在控制层中使用:

      @PostMapping("/test")
        public ExtendVO test(@Valid @RequestBody NewInfoParam p, BindingResult result){
            try {
                if(result.hasErrors()){
                    for (ObjectError error : result.getAllErrors()) {
                        throw new Exception(error.getDefaultMessage());
                    }
                }
                return VOUtils.returnExtendVOSuccess(true);
            } catch (Exception e) {
                e.printStackTrace();
                return VOUtils.returnExtendVOError(CodeEnum.ERROR, null);
            }
        }

    这里演示BindingResult result这个不是必须的,我们可以通过控制层抛出异常,对其进行统一处理。

    第二种就是单个属性验证了:

        @PostMapping("/test1")
        public ExtendVO testGet(@NotNull(message = "年龄不能为空") Integer age){
            try{
                return VOUtils.returnExtendVOSuccess(true);
            }catch (Exception e){
                e.printStackTrace();
                return VOUtils.returnExtendVOError(CodeEnum.ERROR, null);
            }
        }

    还有就是你需要在这个类上加上:

    @Validated 才有效


       @GetMapping("/test")
        public ExtendVO test(@RequestParam(name = "name") String name){
            try {
                return VOUtils.returnExtendVOSuccess(true);
            } catch (Exception e) {
                e.printStackTrace();
                return VOUtils.returnExtendVOError(CodeEnum.ERROR, null);
            }
        }

    以上这段是springmvc自带的,异常最后处理还是在统一抛出来处理

    最后,你需要配置全局统一异常处理:**

     * Created by 异常处理 on 2018/5/24.
     */
    @ControllerAdvice
    @Component
    public class GlobalExceptionHandler {
    
        @ExceptionHandler
        @ResponseBody
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public String handle(Exception exception) {
    
            /**
             * 这里验证单个字段属性
             */
            if(exception instanceof ConstraintViolationException){
                ConstraintViolationException exs = (ConstraintViolationException) exception;
                Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();
                for (ConstraintViolation<?> item : violations) {
                    /**打印验证不通过的信息*/
                    System.out.println(item.getMessage());
                }
            }
    
            /**
             * 这里验证Bean
             */
            if(exception instanceof MethodArgumentNotValidException) {
                MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) exception;
                //按需重新封装需要返回的错误信息
                //解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息
                for (FieldError error : methodArgumentNotValidException.getBindingResult().getFieldErrors()) {
                    ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult();
                    invalidArgument.setDefaultMessage(error.getDefaultMessage());
                    invalidArgument.setField(error.getField());
                    invalidArgument.setRejectedValue(error.getRejectedValue());
                    System.out.println("参数异常:"+error.getField()+error.getDefaultMessage());
    
                }
            }
         
        
    if(exception instanceof MissingServletRequestParameterException){ //GET请求参数异常处理
          //这里可以封装由springmvc自带的
        }
    return "";
        }
    }

    it's ok,你可以达到你的大部分目的了。。。

    hibernate validator 官网:

     http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/#validator-usingvalidator-annotate

  • 相关阅读:
    Java 9的14个新特性总结
    各版本JDK1.5-1.8新特性
    数据库(分库分表)中间件对比
    使用IntelliJ IDEA创建Maven多模块项目
    深入解析淘宝Diamond之客户端架构
    淘宝Diamond架构分析
    apktool 工具
    ubuntu jdk 1.7 安装
    dot 使用笔记
    Chomsky_hierarchy
  • 原文地址:https://www.cnblogs.com/huzi007/p/9082956.html
Copyright © 2020-2023  润新知