专栏首页小勇DW3java使用validator进行校验

java使用validator进行校验

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

1.项目建立

pom.xml

[html] view plain copy
<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">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.fei</groupId>  
  <artifactId>validation-test</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
    
  <dependencies>  
    
    <dependency>  
        <groupId>javax.el</groupId>  
        <artifactId>javax.el-api</artifactId>  
        <version>2.2.4</version>  
    </dependency>  
      
  <dependency>  
        <groupId>org.hibernate</groupId>  
        <artifactId>hibernate-validator</artifactId>  
        <version>5.1.3.Final</version>  
    </dependency>  
    
  </dependencies>  
    
</project>2.基本校验练习
StudentInfo.java


[java] view plain copy
package com.fei.info;  
  
import javax.validation.constraints.Pattern;  
  
import org.hibernate.validator.constraints.NotBlank;  
  
public class StudentInfo {  
  
    @NotBlank(message="用户名不能为空")  
    private String userName;  
      
    @NotBlank(message="年龄不能为空")  
    @Pattern(regexp="^[0-9]{1,2}$",message="年龄是整数")  
    private String age;  
      
    /** 
     * 如果是空,则不校验,如果不为空,则校验 
     */  
    @Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确")  
    private String birthday;  
      
    @NotBlank(message="学校不能为空")  
    private String school;  
  
    public String getUserName() {  
        return userName;  
    }  
  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
  
    public String getAge() {  
        return age;  
    }  
  
    public void setAge(String age) {  
        this.age = age;  
    }  
  
    public String getBirthday() {  
        return birthday;  
    }  
  
    public void setBirthday(String birthday) {  
        this.birthday = birthday;  
    }  
  
    public String getSchool() {  
        return school;  
    }  
  
    public void setSchool(String school) {  
        this.school = school;  
    }  
}  
ValidatorUtil.java

[java] view plain copy
package com.fei.util;  
  
import java.util.HashMap;  
import java.util.Map;  
import java.util.Set;  
  
import javax.validation.ConstraintViolation;  
import javax.validation.Validation;  
import javax.validation.Validator;  
import javax.validation.groups.Default;  
  
public class ValidatorUtil {  
    private static Validator validator = Validation.buildDefaultValidatorFactory()  
            .getValidator();  
      
    public static <T> Map<String,StringBuffer> validate(T obj){  
        Map<String,StringBuffer> errorMap = null;  
        Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);  
        if(set != null && set.size() >0 ){  
            errorMap = new HashMap<String,StringBuffer>();  
            String property = null;  
            for(ConstraintViolation<T> cv : set){  
                //这里循环获取错误信息,可以自定义格式  
                property = cv.getPropertyPath().toString();  
                if(errorMap.get(property) != null){  
                    errorMap.get(property).append("," + cv.getMessage());  
                }else{  
                    StringBuffer sb = new StringBuffer();  
                    sb.append(cv.getMessage());  
                    errorMap.put(property, sb);  
                }  
            }  
        }  
        return errorMap;  
    }  
  
     
}  
ValidatorTest.java

[java] view plain copy
package com.fei;  
  
import java.util.Map;  
  
import com.fei.info.StudentInfo;  
import com.fei.util.ValidatorUtil;  
  
public class ValidatorTest {  
  
    public static void main(String[] args) {  
        StudentInfo s = new StudentInfo();  
        long startTime = System.currentTimeMillis();  
        print(ValidatorUtil.validate(s));  
        System.out.println("===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));  
          
        s.setUserName("小明");  
        s.setAge("a10");  
        s.setBirthday("2016-9-1");  
        startTime = System.currentTimeMillis();  
        print(ValidatorUtil.validate(s));  
        System.out.println("===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));  
          
          
          
    }  
      
    private static void print(Map<String,StringBuffer> errorMap){  
        if(errorMap != null){  
            for(Map.Entry<String, StringBuffer> m : errorMap.entrySet()){  
                System.out.println(m.getKey() + ":" + m.getValue().toString());  
            }  
        }  
    }  
}  

来看看运行结果:

[plain] view plain copy
十二月 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  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springboot集成elasticsearch

      在基础阶段学习ES一般是首先是 安装ES后借助 Kibana 来进行CURD 了解ES的使用;

    小勇DW3
  • 自己平时用到的设计模式总结

    作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:

    小勇DW3
  • Flink中使用Avro格式的自定义序列化反序列化传输

    百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。

    小勇DW3
  • Java基础-22总结转换流,随机访问流,合并流,序列化流,Properties

    (3)转换流: package cn.itcast_04; import java.io.BufferedWriter; import java.io.IOEx...

    奋斗蒙
  • 手写一个WEB应用服务

    之前有小伙伴向我请教一道笔试题:要求写出一个WEB应用服务,不得使用Servlet接口,用Socket实现,可以响应get请求,打印请求信息,并判断请求资源,若...

    南风
  • 手写一个WEB应用服务

    之前有小伙伴向我请教一道笔试题:要求写出一个WEB应用服务,不得使用Servlet接口,用Socket实现,可以响应get请求,打印请求信息,并判断请求资源,若...

    南风
  • 最简单的web服务器实现(一)(r4笔记第68天)

    tomcat作为web服务器,想必大家做过web开发的都离不开tomcat了,值得庆幸的是tomcat也是开放源代码的,最近准备好好琢磨琢磨tomcat的源码,...

    jeanron100
  • 第七阶段-网络编程:【第一章 网络编程】

    我们应该或多或少都有见过IP地址的格式 xxx.xxx.xxx.xxx大致应该是类似这样的,但是计算机不是只能识别二进制的数据,但是很显然,我们的IP地址确实不...

    BWH_Steven
  • java 利用反射模拟动态语言的 eval 函数

    import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; impo...

    用户1177713
  • 一个Java开发的在线视频下载工具,可以把视频分块下载到本地,再拼凑成完整版

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券