【hibernate-validator+SpringMVC】後臺引數校驗框架
阿新 • • 發佈:2018-12-30
hibernate-validator+SpringMVC
簡介:簡單說,就是對Entity進行校驗。
1、導包,沒有很嚴謹的對應關係,所以我用了比較新的版本,支援更多的註解。
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.5.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>6.0.5.Final</version> </dependency>
2、Spring配置檔案中:
<!-- swagger2 --> <!--http://localhost:8080/zztabc/swagger-ui.html#/--> <!--<mvc:default-servlet-handler /> <mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/" />--> <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>
3、entity:
package com.zztabc.controller.vali; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.*; import java.io.Serializable; import java.util.List; /** * 員工表 * @author ZX * */ public class Emp implements Serializable{ private static final long serialVersionUID = 1L; @NotBlank(message="名字不能為空或者空串") @Length(min=2,max=10,message="名字必須由2~10個字組成") private String name; @NotNull @Min(value = 18,message = "年齡應該小於18") private Integer age; @NotNull @Max(value = 50,message = "年齡不能大於50") private Integer ageMax; @NotBlank @Pattern( regexp = "/^[a-z0-9_-]{3,16}$/",message = "使用者名稱為3-16位整數+英文") private String loginName; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getAgeMax() { return ageMax; } public void setAgeMax(Integer ageMax) { this.ageMax = ageMax; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } @Override public String toString() { return "Emp{" + "name='" + name + '\'' + '}'; } }
4、controller:
/**
@Valid Emp e 被驗證的Bean前新增@Valid
BindingResult br 每個被驗證物件後面都跟一個BindingResult物件,裡面持有錯誤返回資訊。
*/
@RequestMapping("/hi2")
public ModelAndView sayHello2(@Valid Emp e ,BindingResult br){
ModelAndView mov = new ModelAndView("hello");
if(br.hasErrors()) {
System.out.println("校驗出錯");
/* FieldError fieldError= br.getFieldError();
System.out.println(fieldError.getDefaultMessage());*/
/* List<ObjectError> ls=br.getAllErrors();
for (int i = 0; i < ls.size(); i++) {
System.out.println("error:"+ls.get(i).getDefaultMessage());
}*/
List<FieldError> list = br.getFieldErrors();
for (FieldError fieldError2 : list) {
System.out.println("屬性名"+fieldError2.getField()+">>>"+fieldError2.getDefaultMessage());
//jsp展示用
mov.addObject(fieldError2.getField()+"Tip",fieldError2.getDefaultMessage());
}
}
return mov;
}
5、jsp返回值:
一般框架提供了標籤進行直接顯示統一返回資料,但是不夠靈活,所以我沒有看那種方式,我在controller中獲取到屬性以及報錯資訊set進了ModelAndView物件,直接使用${屬性名Tip}進行取值即可。
6、註解詳解(摘抄,未找到原創博主,具體也可以看官網):
@Valid 被註釋的元素是一個物件,需要檢查此物件的所有欄位值
@Null 被註釋的元素必須為 null
@NotNull 被註釋的元素必須不為 null
@AssertTrue 被註釋的元素必須為 true
@AssertFalse 被註釋的元素必須為 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個將來的日期
@Pattern(value) 被註釋的元素必須符合指定的正則表示式
2. Hibernate Validator 附加的 constraint
註解 作用
@Email 被註釋的元素必須是電子郵箱地址
@Length(min=, max=) 被註釋的字串的大小必須在指定的範圍內
@NotEmpty 被註釋的字串的必須非空
@Range(min=, max=) 被註釋的元素必須在合適的範圍內
@NotBlank 被註釋的字串的必須非空
@URL(protocol=,host=, port=, regexp=, flags=) 被註釋的字串必須是一個有效的url
@CreditCardNumber 被註釋的字串必須通過Luhn校驗演算法,銀行卡,信用卡等號碼一般都用Luhn計算合法性
@ScriptAssert(lang=, script=, alias=) 要有Java Scripting API 即JSR 223 ("Scripting for the JavaTM Platform")的實現
@SafeHtml(whitelistType=, additionalTags=) classpath中要有jsoup包
hibernate補充的註解中,最後3個不常用,可忽略。
主要區分下@NotNull @NotEmpty @NotBlank 3個註解的區別:
@NotNull 任何物件的value不能為null
@NotEmpty 集合物件的元素不為0,即集合不為空,也可以用於字串不為null
@NotBlank 只能用於字串不為null,並且字串trim()以後length要大於0