Hibernate-validator校验框架使用教程

前言

  • 这几天刚好在弄接口相关东西,发现如果对某个多字段的实体进行验证的话,会写很多麻烦而且冗余的代码,所以学了一下相关验证框架。

Hibernate-Validation

  • 在各层中重复的校验逻辑既导致了不必要的资源消耗,还使得逻辑不够单一(每层都夹杂着校验的逻辑),JSR 303 Bean Validation就是在这种背景下产生的一个数据验证的J2EE规范。而我们这篇文中将要介绍的Hibernate Validator则是JBoss社区开源的一个JSR 303 Bean Validation规范的优秀实践

使用流程

  • 导入maven
<dependency>
        <groupId>org.hibernategroupId>
        <artifactId>hibernate-validatorartifactId>
        <version>6.0.4.Finalversion>
dependency>
  • 配置文件引入相关配置
<mvc:annotation-driven validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <property name="validationMessageSource" ref="messageSource"/>
    bean>
    
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        
        <property name="basename" value="classpath:validationMessages"/>
        
        <property name="fileEncodings" value="GBK"/>
        <property name="defaultEncoding" value="GBK"/>
        <property name="cacheSeconds" value="120"/>
    bean>
  • 创建存储错误消息的properties文件
notnull=该字段不能为空
  • 在验证的model里面对字段进行验证
public class Demo implements Serializable {

    private static final long serialVersionUID = 1L;

    @NotBlank(message = "{notnull}")
    private String name;

    @NotEmpty(message = "{notnull}")
    private List address;

    @NotNull(message = "{notnull}")
    private int address;

}
  • 注意:
  • @NotEmpty 用在集合类上面
  • @NotBlank 用在String上面
  • @NotNull 用在基本类型上

使用方法

  • 1 通过在接口出调用,自动验证
    @RequestMapping(value = "/demo")
    public String baseInfoCompany(@RequestParam @Valid Demo demo ,BindingResult result) {
        if(result.hasErrors()){
            //这边对错误消息进行处理
        }
        return "success"
    }
  • 2 通过工具类,主动验证某个实体类
    @RequestMapping(value = "/demo")
    public String baseInfoCompany(@RequestParam Demo demo) {
        ValidateUtil.validate(demo);
        return "success"
    }
  • ValidateUtil文件
public class ValidateUtil {

    public static  void validate(T obj) {
        LocalValidatorFactoryBean validator = (LocalValidatorFactoryBean) SpringContextHolder.getBean("validator");//这边获取spring已经实例化的验证器即可,即刚才配置文件里配置验证器id
        Set> constraintViolations = validator.validate(obj);
        //抛出检验异常
        Iterator> iter = constraintViolations.iterator();
        while (iter.hasNext()) {
            ConstraintViolation error = iter.next();
            StringBuffer buffer = new StringBuffer().append("[")
                    .append(error.getPropertyPath().toString()).append("]")
                    .append(error.getMessage());
            throw new IllegalArgumentException(buffer.toString());
        }

    }

}
  • 给点小福利吧,全局捕捉异常的例子
    //这个定义要捕捉的异常类
    @ExceptionHandler({IllegalArgumentException.class})
    @ResponseBody
    public RespBean runTimeException(HttpServletRequest request, IllegalArgumentException e) {
        String uri = request.getRequestURI();
        LOGGER.error("[" + uri + "]捕获非法异常{}", e.getMessage(), e);
        return ErrRespBean.newInstance(ReturnConsts.ERROR_EXCEPTION, e.getMessage());
    }

后语

  • 千万注意实体类里注解引用的message引用properties的key一定要正确,不然像我因为这个点,找了很久的问题。有什么问题可以留言,感谢您耐心看完。

你可能感兴趣的:(java服务端开发)