java使用validator进行校验

转自:https://blog.csdn.net/dream_broken/article/details/53584169

     不管是html页面表单提交的对象数据还是和第三方公司进行接口对接,都需要对接收到的数据进行校验(非空、长度、格式等等)。如果使用if一个个进行校验(字段非常多),这是让人崩溃的过程。幸好jdk或hibernate都提供了对object对象的校验,只需加上相应的注解即可。

     本人喜欢学习时,都建立个maven小项目进行实践学习。

1.项目建立


pom.xml


 
 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0 </modelVersion>
  3. <groupId>com.fei </groupId>
  4. <artifactId>validation-test </artifactId>
  5. <version>0.0.1-SNAPSHOT </version>
  6. <dependencies>
  7. <dependency>
  8. <groupId>javax.el </groupId>
  9. <artifactId>javax.el-api </artifactId>
  10. <version>2.2.4 </version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.hibernate </groupId>
  14. <artifactId>hibernate-validator </artifactId>
  15. <version>5.1.3.Final </version>
  16. </dependency>
  17. </dependencies>
  18. </project>
  是用来练手的

2.基本校验练习

StudentInfo.java


 
 
  1. package com.fei.info;
  2. import javax.validation.constraints.Pattern;
  3. import org.hibernate.validator.constraints.NotBlank;
  4. public class StudentInfo {
  5. @NotBlank(message= "用户名不能为空")
  6. private String userName;
  7. @NotBlank(message= "年龄不能为空")
  8. @Pattern(regexp= "^[0-9]{1,2}$",message= "年龄是整数")
  9. private String age;
  10. /**
  11. * 如果是空,则不校验,如果不为空,则校验
  12. */
  13. @Pattern(regexp= "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message= "出生日期格式不正确")
  14. private String birthday;
  15. @NotBlank(message= "学校不能为空")
  16. private String school;
  17. public String getUserName() {
  18. return userName;
  19. }
  20. public void setUserName(String userName) {
  21. this.userName = userName;
  22. }
  23. public String getAge() {
  24. return age;
  25. }
  26. public void setAge(String age) {
  27. this.age = age;
  28. }
  29. public String getBirthday() {
  30. return birthday;
  31. }
  32. public void setBirthday(String birthday) {
  33. this.birthday = birthday;
  34. }
  35. public String getSchool() {
  36. return school;
  37. }
  38. public void setSchool(String school) {
  39. this.school = school;
  40. }
  41. }
ValidatorUtil.java


 
 
  1. package com.fei.util;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. import javax.validation.ConstraintViolation;
  6. import javax.validation.Validation;
  7. import javax.validation.Validator;
  8. import javax.validation.groups.Default;
  9. public class ValidatorUtil {
  10. private static Validator validator = Validation.buildDefaultValidatorFactory()
  11. .getValidator();
  12. public static <T> Map<String,StringBuffer> validate(T obj){
  13. Map<String,StringBuffer> errorMap = null;
  14. Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);
  15. if(set != null && set.size() > 0 ){
  16. errorMap = new HashMap<String,StringBuffer>();
  17. String property = null;
  18. for(ConstraintViolation<T> cv : set){
  19. //这里循环获取错误信息,可以自定义格式
  20. property = cv.getPropertyPath().toString();
  21. if(errorMap.get(property) != null){
  22. errorMap.get(property).append( "," + cv.getMessage());
  23. } else{
  24. StringBuffer sb = new StringBuffer();
  25. sb.append(cv.getMessage());
  26. errorMap.put(property, sb);
  27. }
  28. }
  29. }
  30. return errorMap;
  31. }
  32. }
ValidatorTest.java


 
 
  1. package com.fei;
  2. import java.util.Map;
  3. import com.fei.info.StudentInfo;
  4. import com.fei.util.ValidatorUtil;
  5. public class ValidatorTest {
  6. public static void main(String[] args) {
  7. StudentInfo s = new StudentInfo();
  8. long startTime = System.currentTimeMillis();
  9. print(ValidatorUtil.validate(s));
  10. System.out.println( "===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
  11. s.setUserName( "小明");
  12. s.setAge( "a10");
  13. s.setBirthday( "2016-9-1");
  14. startTime = System.currentTimeMillis();
  15. print(ValidatorUtil.validate(s));
  16. System.out.println( "===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
  17. }
  18. private static void print(Map<String,StringBuffer> errorMap){
  19. if(errorMap != null){
  20. for(Map.Entry<String, StringBuffer> m : errorMap.entrySet()){
  21. System.out.println(m.getKey() + ":" + m.getValue().toString());
  22. }
  23. }
  24. }
  25. }

来看看运行结果:

十二月 12, 2016 4:02:00 下午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.3.Final
school:学校不能为空
age:年龄不能为空
userName:用户名不能为空
===============耗时(毫秒)=280
birthday:出生日期格式不正确
school:学校不能为空
age:年龄是整数
===============耗时(毫秒)=3
   看到运行结果,心中一喜,达到了我们的要求。


   看StudentInfo中的import发现注解的来源有来自javax和hibernate。

javax中有





hibernate中有



  如果现有的校验规则都不满足,则可以自定义校验规则

3.自定义校验规则

Money.java

package com.fei.validator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MoneyValidator.class)
public @interface Money {

<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">message</span>() <span class="hljs-selector-tag">default</span>"不是金额形式";

<span class="hljs-selector-tag">Class</span>&lt;?&gt;<span class="hljs-selector-attr">[]</span> <span class="hljs-selector-tag">groups</span>() <span class="hljs-selector-tag">default</span> {};

<span class="hljs-selector-tag">Class</span>&lt;? <span class="hljs-selector-tag">extends</span> <span class="hljs-selector-tag">Payload</span>&gt;<span class="hljs-selector-attr">[]</span> <span class="hljs-selector-tag">payload</span>() <span class="hljs-selector-tag">default</span> {};

}

MoneyValidator.java

package com.fei.validator;

import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MoneyValidator implements ConstraintValidator<Money, Double> {

<span class="hljs-keyword">private</span> String moneyReg = <span class="hljs-string">"^\\d+(\\.\\d{1,2})?$"</span>;<span class="hljs-comment">//表示金额的正则表达式</span>
<span class="hljs-keyword">private</span> Pattern moneyPattern = Pattern.compile(moneyReg);

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initialize</span><span class="hljs-params">(Money money)</span> </span>{
   <span class="hljs-comment">// TODO Auto-generated method stub</span>
  
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isValid</span><span class="hljs-params">(Double value, ConstraintValidatorContext arg1)</span> </span>{
   <span class="hljs-keyword">if</span> (value == <span class="hljs-keyword">null</span>)
	   <span class="hljs-comment">//金额是空的,返回true,是因为如果null,则会有@NotNull进行提示</span>
	   <span class="hljs-comment">//如果这里false的话,那金额是null,@Money中的message也会进行提示</span>
	   <span class="hljs-comment">//自己可以尝试</span>
       <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
   <span class="hljs-keyword">return</span> moneyPattern.matcher(value.toString()).matches();
}

}

StudentInfo.java

加上,注意因为money是Double,所以不能用@NotBlank,因为@NotBlank是对字符串校验的

@NotNull(message="金额不能为空")
	@Money(message="金额格式不正确")
	private Double money;

ValidatorTest.java

package com.fei;

import java.util.Map;

import com.fei.info.StudentInfo;
import com.fei.util.ValidatorUtil;

public class ValidatorTest {

<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> void main(<span class="hljs-type">String</span>[] args) {
	<span class="hljs-type">StudentInfo</span> s = new <span class="hljs-type">StudentInfo</span>();
	long startTime = <span class="hljs-type">System</span>.currentTimeMillis();
	<span class="hljs-built_in">print</span>(<span class="hljs-type">ValidatorUtil</span>.validate(s));
	<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(<span class="hljs-string">"===============耗时(毫秒)="</span> + (<span class="hljs-type">System</span>.currentTimeMillis() - startTime));
	
	s.setUserName(<span class="hljs-string">"小明"</span>);
	s.setAge(<span class="hljs-string">"a10"</span>);
	s.setBirthday(<span class="hljs-string">"2016-9-1"</span>);
	s.setMoney(<span class="hljs-number">100.00001</span>);
	startTime = <span class="hljs-type">System</span>.currentTimeMillis();
	<span class="hljs-built_in">print</span>(<span class="hljs-type">ValidatorUtil</span>.validate(s));
	<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(<span class="hljs-string">"===============耗时(毫秒)="</span> + (<span class="hljs-type">System</span>.currentTimeMillis() - startTime));
	
	
	
}

<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> void <span class="hljs-built_in">print</span>(<span class="hljs-type">Map</span>&lt;<span class="hljs-type">String</span>,<span class="hljs-type">StringBuffer</span>&gt; errorMap){
	<span class="hljs-keyword">if</span>(errorMap != null){
		<span class="hljs-keyword">for</span>(<span class="hljs-type">Map</span>.<span class="hljs-type">Entry</span>&lt;<span class="hljs-type">String</span>, <span class="hljs-type">StringBuffer</span>&gt; m : errorMap.entrySet()){
			<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(m.getKey() + <span class="hljs-string">":"</span> + m.getValue().<span class="hljs-built_in">toString</span>());
		}
	}
}

}
运行结果:

十二月 12, 2016 4:42:41 下午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.3.Final
school:学校不能为空
age:年龄不能为空
money:金额不能为空
userName:用户名不能为空
===============耗时(毫秒)=280
birthday:出生日期格式不正确
school:学校不能为空
age:年龄是整数
money:金额格式不正确
===============耗时(毫秒)=4

  当然,如果你的项目使用springMVC或structs2,都会对应的集成方法。

4.级联校验

  如果校验的对象中包含另一个对象信息时,校验也要同时校验另一个对象,则可以使用@Valid

ParentInfo.java

package com.fei.info;

import org.hibernate.validator.constraints.NotBlank;

public class ParentInfo {

<span class="hljs-meta">@NotBlank</span>(message=<span class="hljs-string">"父亲名称不能为空"</span>)
<span class="hljs-keyword">private</span> String fatherName;

<span class="hljs-meta">@NotBlank</span>(message=<span class="hljs-string">"母亲名称不能为空"</span>)
<span class="hljs-keyword">private</span> String motherName;

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getFatherName</span><span class="hljs-params">()</span> </span>{
	<span class="hljs-keyword">return</span> fatherName;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setFatherName</span><span class="hljs-params">(String fatherName)</span> </span>{
	<span class="hljs-keyword">this</span>.fatherName = fatherName;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getMotherName</span><span class="hljs-params">()</span> </span>{
	<span class="hljs-keyword">return</span> motherName;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setMotherName</span><span class="hljs-params">(String motherName)</span> </span>{
	<span class="hljs-keyword">this</span>.motherName = motherName;
}

}
StudentInfo.java

中加入,set,get是必须的

/**
	 * 如果不加@NotNull,则prentInfo=null时,不会对ParentInfo内的字段进行校验
	 */
	@NotNull(message="父母信息不能为空")
	@Valid
	private ParentInfo parentInfo;
ValidatorTest.java


 
 
  1. package com.fei;
  2. import java.util.Map;
  3. import com.fei.info.ParentInfo;
  4. import com.fei.info.StudentInfo;
  5. import com.fei.util.ValidatorUtil;
  6. public class ValidatorTest {
  7. public static void main(String[] args) {
  8. StudentInfo s = new StudentInfo();
  9. long startTime = System.currentTimeMillis();
  10. print(ValidatorUtil.validate(s));
  11. System.out.println( "===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
  12. s.setUserName( "小明");
  13. s.setAge( "a10");
  14. s.setBirthday( "2016-9-1");
  15. s.setMoney( 100.00001);
  16. s.setParentInfo( new ParentInfo());
  17. startTime = System.currentTimeMillis();
  18. print(ValidatorUtil.validate(s));
  19. System.out.println( "===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
  20. }
  21. private static void print(Map<String,StringBuffer> errorMap){
  22. if(errorMap != null){
  23. for(Map.Entry<String, StringBuffer> m : errorMap.entrySet()){
  24. System.out.println(m.getKey() + ":" + m.getValue().toString());
  25. }
  26. }
  27. }
  28. }

运行结果:

十二月 12, 2016 4:56:16 下午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.3.Final
parentInfo:父母信息不能为空
school:学校不能为空
age:年龄不能为空
money:金额不能为空
userName:用户名不能为空
===============耗时(毫秒)=285
birthday:出生日期格式不正确
school:学校不能为空
parentInfo.fatherName:父亲名称不能为空
age:年龄是整数
parentInfo.motherName:母亲名称不能为空
money:金额格式不正确
===============耗时(毫秒)=9






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值