1. 程式人生 > 實用技巧 >springMVC學習(五)校驗器Validation

springMVC學習(五)校驗器Validation

校驗器Validation

輸入驗證是Spring處理的最重要Web開發任務之一,SpringMVC使用JSR-303(javaEE6規範的一部分)校驗規範, JSR 303 用於對 Java Bean 中的欄位的值進行驗證,JSR只是一個規範文件,本身用處不大,除非編寫了它的實現。用於實現JSR Bean Validation,Hibernate Validator就是它的一個實現,springmvc使用的是Hibernate Validator(和Hibernate的ORM無關),常用JSR 303註解約束:

  • @AssertFalse,驗證 Boolean 物件是否為 false(@AssertTrue)

  • @DecimalMax,被標註的值必須不大於約束中指定的最大值. 這個約束的引數是一個通過BigDecimal定義的最大值的字串表示.小數存在精度(@DecimalMin)

  • @Digits(integer=,fraction=),驗證字串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度

  • @Future,驗證 Date 和 Calendar 物件是否在當前時間之後 (@Past)

  • @Max,驗證 Number 和 String 物件是否小等於指定的值(@Min)

  • @NotNull,驗證物件是否不為null, 無法查檢長度為0的字串(@Null)

  • @Pattern,驗證 String 物件是否符合正則表示式的規則

  • @Size,驗證物件(Array,Collection,Map,String)長度是否在給定的範圍之內

開發步驟:

  • 匯入jar包

    • hibernate-validator-6.0.16.Final.jar

    • validation-api-2.1.0.Final.jar

    • jboss-logging-3.4.0.Final

  • ValidationMessages.properties配置檔案,配置提示資訊

items.name.length.error=商品名稱的長度為1到30個字元
items.createTime.is.notNull=商品生產日期不能為空
  • springMVC配置檔案新增配置

  <!--校驗器配置-->
<!-- 錯誤資訊的校驗檔案配置 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 資原始檔名 -->
<property name="basenames">
<list>
<value>classpath:ValidationMessages</value>
</list>
</property>
<!-- 資原始檔編碼格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 對資原始檔內容快取時間,單位秒 -->
<property name="cacheSeconds" value="120" />
</bean>

<!-- 配置校驗器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校驗器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校驗使用的資原始檔,如果不指定則預設使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>

<!-- 新增到自定義引數繫結的WebBindingInitializer中 -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<!-- 配置validator -->
<property name="validator" ref="validator" />
</bean>

<!-- WebBindingInitializer新增到介面卡中 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<!-- 在webBindingInitializer中注入自定義屬性編輯器、自定義轉換器 -->
<property name="webBindingInitializer" ref="customBinder"/>
</bean>
  • 在POJO中定義規則

public class Items {
private Integer id;
@Size(min = 1,max = 30,message = "{items.name.length.error}")
private String name;
@NotNull(message = "{items.createTime.is.notNull}")
private Date createTime;
//Getter and Setter
}
  • 驗證時,在controller裡面用@Validated表示該實體(引數)需要驗證,然後用BindingResult物件接受驗證結果,當驗證不通過時BindingResult就會接受對應的錯誤提示資訊

  @RequestMapping("/valid.action")
public void valid(@RequestBody @Validated Items items, BindingResult result){
List<ObjectError> errors=result.getAllErrors();
for(ObjectError error:errors){
System.out.println(error.getDefaultMessage());
}
}

分組校驗

分組校驗其實就是為了我們的校驗更加靈活,針對不同的 Controller方法達到個性化驗證;比如:修改商品資訊,只校驗日期不為空。那麼此時,我們就可以用到分組校驗了,開發步驟:

  • 定義分組的介面(介面不定義方法,只作為一個標識)

public interface ValidateGroup1 {
}
  • 定於校驗規則屬於哪一各組( @Size、@NotNull 中新增 groups屬性)

  @NotNull(message = "items.id.is.notNull",groups = {ValidateGroup1.class})
private Integer id;
  • 在Controller方法中定義使用校驗分組(@Validated 註解屬性value 指明哪個分組,@Validated(value={ValidateGroup1.class})

  @PostMapping("/valid1.action")
public void valid1(@RequestBody @Validated(value = {ValidateGroup1.class}) Items items, BindingResult result){
List<ObjectError> errors=result.getAllErrors();
for(ObjectError error:errors){
System.out.println(error.getDefaultMessage());
}
}