hibernate-validator校驗框架學習


1、引入jar包

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
     <artifactId>javax.el</artifactId>
    <version>2.2.4</version>
</dependency>

注意:

  • 當使用hibernate-validator更高版本時,會報一個java.lang.ClassNotFoundException: javax.el.ELManager錯誤,目前博主還未找到兼容的方案,因此采用了5.4.1.Final版本。
  • 當不添加javax.el-api和javax.el依賴時,項目也可以運行,因為tomcat容器包含hibernate-validator所依賴的類

2、spring-mvc配置

<mvc:annotation-driven conversion-service="conversionService" validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
  <property name="validationMessageSource" ref="messageSource"></property>
</bean>
<!-- 檢驗錯誤信息資源配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="basenames">
    <list>
      <value>classpath:validator/validationMessages</value>
    </list>
  </property>
  <!-- 資源文件編碼格式 -->
  <property name="fileEncodings" value="utf-8"/>
  <!-- 對資源文件內容的緩存時間,單位秒 -->
  <property name="cacheSeconds" value="120"/>
</bean>

3、在實體上增加相應注解校驗信息

private Integer stuId;
@NotBlank(message = "{notnull}")
@Size(max = 20, min = 2, message = "姓名長度在2-20之間")
private String name;
@Max(value = 200, message = "最大年齡200歲")
@Min(value = 6, message = "最小年齡6歲")
private Integer age;

注意:

message=“{notnull}”會去配置的錯誤文件中查找,即validator/validationMessages.properties文件中查找notnull的配置對應的錯誤信息。

4、使用方式

a) 自動校驗

  在實體上增加@Validated注解,表示要校驗這個實體。BindingResult用於接收驗證后的錯誤信息。

@RequestMapping(value = "/add", method = { RequestMethod.GET, RequestMethod.POST })
public String addStudent(Model model, HttpServletRequest request, @Validated Student stu,
        BindingResult bindingResult) {
    if (HttpRequestContext.GET.equalsIgnoreCase(request.getMethod())) {
        return "prictice/student/addStudent";
    } else {
        if (bindingResult.hasErrors()) {
            List<ObjectError> errors = bindingResult.getAllErrors();
            model.addAttribute("errors", errors);
            return "prictice/student/addStudent";
        }
        stu.setRegTime(new Date());
        stu.setStatus(true);
        studentService.addStudent(stu);
        return "redirect:/student/list";
    }
}

b) 主動校驗

通過工具類,主動驗證某個實體類

新建工具類ValidateUtil.java

public class ValidateUtil {

    public static <T> void validate(T obj) {
        LocalValidatorFactoryBean validator = (LocalValidatorFactoryBean) SpringContextHolder.getBean("validator");
        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());
        }
    }
}

或者可以使用下面的代碼獲取validator

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

 調用

@RequestMapping(value = "/add")
public String addStudent(@RequestParam Student stu) {
    ValidateUtil.validate(stu);
    return "redirect:/student/list"
}

5、常用注解

注解

作用

AssertTrue

布爾值為真

AssertFalse

布爾值為假

Null

引用為空

NotNull

引用不為空

NotEmpty

字符串引用和值都不是空

Min

數字的最小值

Max

數字的最大值

Past

日期必須是過去

Future

日期必須是未來

Pattern

字符串必須匹配正則表達式

Valid

遞歸驗證引用

Size

驗證字符串是否在Size范圍內

Email

驗證字符串是否是一個有效的電子郵箱

URL

字符串是否是一個有效的URL

注意:

  • @NotEmpty 用在集合類上面
  • @NotBlank 用在String上面
  • @NotNull 用在基本類型上
  • @Email和@URL是Hibernate Validator自定義的,假如使用其他的Bean Validation實現,可能沒有這兩個注解。
  • 和JPA注解一樣,如果驗證注解添加到字段上,Hibernate就會直接讀取字段的值。如果注解到Getter方法上,Hibernate就會調用方法取得值。在一個類中不要同時應用這兩種方式,會導致重復驗證的問題。
  • 如果在一個集合上應用Valid注解, Hibernate就會遞歸驗證集合中的每一個元素。



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM