javascript
Java数据校验(Bean Validation / JSR303)
文檔: http://beanvalidation.org/1.1/spec/
API : http://docs.jboss.org/hibernate/beanvalidation/spec/1.1/api/
http://blog.sina.com.cn/s/blog_a3d2fd2d0101hyu7.html
http://haohaoxuexi.iteye.com/blog/1812584
JSR303是JAVA EE6中的子規(guī)范。用于對(duì)Java Bean的字段值進(jìn)行校驗(yàn),確保輸入進(jìn)來(lái)的數(shù)據(jù)在語(yǔ)義上是正確的,使驗(yàn)證邏輯從業(yè)務(wù)代碼中脫離出來(lái)。JSR303是運(yùn)行時(shí)數(shù)據(jù)驗(yàn)證框架,驗(yàn)證之后驗(yàn)證的錯(cuò)誤信息會(huì)馬上返回。有兩個(gè)版本JSR303(BeanValidation1.0)和JSR349(BeanValidation1.1)。
javax.validation:validation-api:jar:1.1.0.Final
實(shí)現(xiàn)版本:
- org.hibernate:hibernate-validator:5.2.4.Final
- org.apache.bval:bval-jsr303:0.5
- jersery
注解
@NotNull | 引用類(lèi)型 | 注解元素必須非空
@Null | 引用類(lèi)型 |元素為空
@Digits | byte,short,int,long及其包裝器,BigDecimal,BigInteger,String| 驗(yàn)證數(shù)字是否合法。屬性:integer(整數(shù)部分), fraction(小數(shù)部分)
@Future/@Past| java.util.Date, java.util.Calendar | 是否在當(dāng)前時(shí)間之后或之前
@Max/@Min | byte,short,int,long及其包裝器,BigDecimal,BigInteger | 驗(yàn)證值是否小于等于最大指定整數(shù)值或大于等于最小指定整數(shù)值
@Pattern | String |驗(yàn)證字符串是否匹配指定的正則表達(dá)式。屬性:regexp(正則), flags(選項(xiàng),Pattern.Flag值)
@Size | String, Collection, Map, 數(shù)組 | 驗(yàn)證元素大小是否在指定范圍內(nèi)。屬性:max(最大長(zhǎng)度), min(最小長(zhǎng)度), message(提示,默認(rèn)為{constraint.size})
@DecimalMax/@DecimalMin | byte,short,int,long及其包裝器,BigDecimal,BigInteger,String | 驗(yàn)證值是否小于等于最大指定小數(shù)值或大于等于最小指定小數(shù)值
@Valid | |驗(yàn)證值是否需要遞歸調(diào)用
@Null
@NotNull
@AssertFalse
@AssertTrue
@DecimalMax(value) 不大于value的數(shù)值
@DecimalMin(value) 不小于value的數(shù)值
@Digits(integer,fraction) 整數(shù)部分不超過(guò)integer,小數(shù)部分不超過(guò)fraction
@Future 將來(lái)的日期
@Past 過(guò)去的日期
@Max(value) 不大于value的數(shù)值
@Min(value) 不小于value的數(shù)值
@Pattern(value) 滿足指定正則表達(dá)式
@Size(max,min) 長(zhǎng)度在min到max之間
定義自己的約束類(lèi)型
定義注解,message、groups和payload三個(gè)屬性是必須定義的。
@Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=MoneyValidator.class) //用于限制的注解,驗(yàn)證類(lèi)為MoneyValidator public @interface Money { String message() default"不是金額形式"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }定義驗(yàn)證類(lèi)
public class MoneyValidator implements ConstraintValidator<Money, Double> { private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金額的正則表達(dá)式 private Pattern moneyPattern = Pattern.compile(moneyReg); public void initialize(Money money) { // TODO Auto-generated method stub } public boolean isValid(Double value, ConstraintValidatorContext arg1) { // TODO Auto-generated method stub if (value == null) return true; return moneyPattern.matcher(value.toString()).matches(); } }ConstraintValidator使用了泛型,有兩個(gè)類(lèi)型參數(shù)。第一個(gè)類(lèi)型是對(duì)應(yīng)的initialize方法的參數(shù)類(lèi)型(約束注解類(lèi)型),第二個(gè)類(lèi)型是對(duì)應(yīng)的isValid方法的第一個(gè)參數(shù)類(lèi)型。
Hibernate Validator
Hibernate Validator附加的constraint(hibernate-validator和validation-api)
@Email 被注釋的元素必須是電子郵箱地址
@Length 字符串的大小必須在指定的范圍內(nèi)
@NotEmpty 被注釋的字符串的必須非空
@Range 被注釋的元素必須在合適的范圍內(nèi)
驗(yàn)證對(duì)象類(lèi)型
字段約束
當(dāng)約束被定義在字段上的時(shí)候, 這個(gè)字段的值是通過(guò)字段訪問(wèn)策略來(lái)獲取并驗(yàn)證的. 也就是說(shuō)Bean Validation的實(shí)現(xiàn)者會(huì)直接訪問(wèn)這個(gè)實(shí)例變量而不會(huì)調(diào)用屬性的訪問(wèn)器(getter) 即使這個(gè)方法存在。靜態(tài)字段或者屬性是不會(huì)被校驗(yàn)的
屬性約束
必須遵守JavaBeans規(guī)范,且定義在getter上,不能定義在setter上
類(lèi)約束
約束繼承
驗(yàn)證子類(lèi)時(shí)所有基類(lèi)中的約束也都會(huì)被使用
對(duì)象圖
@Valid注解類(lèi)中的對(duì)象屬性
Validator接口
```java
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
... = validator.validate(obj); //對(duì)一個(gè)給定的實(shí)體對(duì)象中定義的所有約束進(jìn)行校驗(yàn)
... = validator.validateProperty(); //通過(guò)validateProperty()可以對(duì)一個(gè)給定實(shí)體對(duì)象的單個(gè)屬性進(jìn)行校驗(yàn),需要符合JavaBean命名規(guī)范
... = validator.validateValue(); //校驗(yàn)如果把一個(gè)特定的值賦給一個(gè)類(lèi)的某一個(gè)屬性的話,是否會(huì)違反此類(lèi)中定義的約束條件
約束提示信息
- 可直接通過(guò)注解的message屬性設(shè)置
- 通過(guò)message提供模板,ValidationMessages.properties中定義
Spring MVC Validator接口
定義Validator。 Supports方法用于判斷當(dāng)前的Validator實(shí)現(xiàn)類(lèi)是否支持校驗(yàn)當(dāng)前需要校驗(yàn)的實(shí)體類(lèi),只有當(dāng)supports方法的返回結(jié)果為true的時(shí)候,該Validator接口實(shí)現(xiàn)類(lèi)的validate方法才會(huì)被調(diào)用來(lái)對(duì)當(dāng)前需要校驗(yàn)的實(shí)體類(lèi)進(jìn)行校驗(yàn)。
public class UserValidator implements Validator { public boolean supports(Class<?> clazz) { return User.class.equals(clazz); } public void validate(Object obj, Errors errors) { ValidationUtils.rejectIfEmpty(errors, "username", null, "Username is empty."); User user = (User) obj; if (null == user.getPassword() || "".equals(user.getPassword())) errors.rejectValue("password", null, "Password is empty."); } }使用Validator進(jìn)行驗(yàn)證。在SpringMVC中我們可以使用DataBinder來(lái)設(shè)定當(dāng)前Controller需要使用的Validator。
@Controller public class UserController { @InitBinder public void initBinder(DataBinder binder) { binder.setValidator(new UserValidator()); } @RequestMapping("login") public String login(@Valid User user, BindingResult result) { if (result.hasErrors()) return "redirect:user/login"; return "redirect:/"; } }必須使用@Valid標(biāo)注我們需要校驗(yàn)的參數(shù)user,否則Spring不會(huì)對(duì)它進(jìn)行校驗(yàn)。另外我們的處理器方法必須給定包含Errors的參數(shù),這可以是Errors本身,也可以是它的子類(lèi)BindingResult,使用了Errors參數(shù)就是告訴Spring關(guān)于表單對(duì)象數(shù)據(jù)校驗(yàn)的錯(cuò)誤將由我們自己來(lái)處理,否則Spring會(huì)直接拋出異常,而且這個(gè)參數(shù)是必須緊挨著@Valid參數(shù)的,即必須緊挨著需要校驗(yàn)的參數(shù),這就意味著我們有多少個(gè)@Valid參數(shù)就需要有多少個(gè)對(duì)應(yīng)的Errors參數(shù),它們是一一對(duì)應(yīng)的。
如果我們希望一個(gè)Validator對(duì)所有的Controller都起作用的話,我們可以通過(guò)WebBindingInitializer的initBinder方法來(lái)設(shè)定了。另外,在SpringMVC的配置文件中通過(guò)mvc:annotation-driven的validator屬性也可以指定全局的Validator。
Spring可以通過(guò)@Resource或@AutoWired注解向ConstraintValidator注入對(duì)象。
轉(zhuǎn)載于:https://www.cnblogs.com/pixy/p/5306567.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Java数据校验(Bean Validation / JSR303)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 常用命令笔记 (持续更新)
- 下一篇: Django--form验证及错误处理