Hibernate-validator校驗框架使用教程

前言

  • 這幾天剛好在弄接口相關東西,發現如果對某個多字段的實體進行驗證的話,會寫很多麻煩而且冗餘的代碼,所以學了一下相關驗證框架。

Hibernate-Validation

  • 在各層中重複的校驗邏輯既導致了不必要的資源消耗,還使得邏輯不夠單一(每層都夾雜着校驗的邏輯),JSR 303 Bean Validation就是在這種背景下產生的一個數據驗證的J2EE規範。而我們這篇文中將要介紹的Hibernate Validator則是JBoss社區開源的一個JSR 303 Bean Validation規範的優秀實踐

使用流程

  • 導入maven
<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.4.Final</version>
</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<String> 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 <T> void validate(T obj) {
        LocalValidatorFactoryBean validator = (LocalValidatorFactoryBean) SpringContextHolder.getBean("validator");//這邊獲取spring已經實例化的驗證器即可,即剛纔配置文件裏配置驗證器id
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
        //拋出檢驗異常
        Iterator<ConstraintViolation<T>> iter = constraintViolations.iterator();
        while (iter.hasNext()) {
            ConstraintViolation<T> 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一定要正確,不然像我因爲這個點,找了很久的問題。有什麼問題可以留言,感謝您耐心看完。
發佈了42 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章