Skip to content

Latest commit

 

History

History
321 lines (252 loc) · 9.82 KB

1.参数校验-1-validation注解.md

File metadata and controls

321 lines (252 loc) · 9.82 KB

参数校验-1-validation 注解


简介: Java 中参数校验是一个非常常见的操作,本文将介绍使用 java 注解的方式实现参数校验

1 Maven 依赖

pom.xml 文件: ../pom.xml

数据校验核心依赖:

    <!-- validation -->
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>${hibernate.validator}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator-cdi</artifactId>
      <version>${hibernate.validator}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.el</artifactId>
      <version>${javax.el}</version>
    </dependency>

其中 ${hibernate.validator} 值为 6.0.13.Final, ${javax.el} 的值为 3.0.1-b10,如有新版本则使用新版本即可

其他依赖:

<!-- lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok}</version>
      <scope>provided</scope>
    </dependency>

lombok 注解用于生成 setter,getter,toString 等方法,使用该注解之后无需手动写以上方法

${lombok} 值为 1.18.0

2 参数校验工具类

com.ljq.demo.util.BeanValidateUtil

package com.ljq.demo.util;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Iterator;
import java.util.Set;

/**
 * @Description: java bean 校验工具类
 * @Author: junqiang.lu
 * @Date: 2018/9/28
 */
public class BeanValidateUtil {

    private BeanValidateUtil(){}

    /**
     * java bean 数据校验
     * 参数符合要求,返回 null,否则返回错误原因
     *
     * @param target 目标 bean
     * @param <T>
     * @return
     */
    public static <T> String validate(T target){
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(target);
        Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
        while (iterator.hasNext()) {
            ConstraintViolation<T> error = iterator.next();
            StringBuffer buffer = new StringBuffer().append("[")
                    .append(error.getPropertyPath().toString()).append("]")
                    .append(error.getMessage());
            return buffer.toString();
        }
        return  null;
    }


}

3 使用参数校验注解的实体类

com.ljq.demo.bean.ValidationDemoChildBean

package com.ljq.demo.bean;

import lombok.Data;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

/**
 * @Description: java bean 校验引用类
 * @Author: junqiang.lu
 * @Date: 2018/9/28
 */
@Data
public class ValidationDemoChildBean implements Serializable {

    private static final long serialVersionUID = 8313082827473756093L;

    /**
     * 身高,单位: cm
     */
    @Min(value = 1, message = "最小值必须大于等于 1")
    @Max(value = 300, message = "最大值不超过 300")
    private int height;

    /**
     * 手机号
     * 中国大陆11位手机号码,匹配格式:前三位固定格式+后8位任意数
     */
    @NotNull(message = "手机号不能为空")
    @Pattern(regexp = "^((13[0-9])|145|147|(15[^4])|166|(17[^2])|(17[^4])|(17[^9])|(18[0-9])|(19[8-9]))\\d{8}$",
        message = "手机号不符合要求")
    private String phone;


}

com.ljq.demo.bean.ValidationDemoBean

package com.ljq.demo.bean;

import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * @Description: java validation demo
 * @Author: junqiang.lu
 * @Date: 2018/9/28
 */
@Data
public class ValidationDemoBean implements Serializable {

    private static final long serialVersionUID = -1168911794208531678L;

    /**
     * 用户名
     */
    @NotNull(message = "用户名不能为空")
    private String userName;

    /**
     * 年龄
     */
    @Max(value = 150,message = "最大年龄不超过150岁")
    private int age;

    /**
     * 邮箱
     */
    @Email(message = "邮箱格式不正确")
    private String email;


    @NotNull(message = "childBean 不能为空")
    @Valid
    private ValidationDemoChildBean childBean;

}

4 参数校验测试类

com.ljq.demo.util.BeanValidateUtilTest

package com.ljq.demo.util;

import com.ljq.demo.bean.ValidationDemoBean;
import com.ljq.demo.bean.ValidationDemoChildBean;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

public class BeanValidateUtilTest {

    private static final Logger logger = LoggerFactory.getLogger(BeanValidateUtilTest.class);

    @Test
    public void validate() {

        List<ValidationDemoChildBean> demoChildBeanList = new ArrayList<>(16);
        List<ValidationDemoBean> demoBeanList = new ArrayList<>(16);

        /**
         * case 0 测试属性非空,字符串属性设置为 ""
         */
        ValidationDemoChildBean demoChildBean0 = new ValidationDemoChildBean();
        demoChildBean0.setHeight(12);
        demoChildBean0.setPhone("");
        demoChildBeanList.add(demoChildBean0);

        /**
         * case 1 测试属性非空
         */
        ValidationDemoChildBean demoChildBean1 = new ValidationDemoChildBean();
        demoChildBean1.setHeight(1);
        demoChildBeanList.add(demoChildBean1);
        /**
         * case 2 测试数字
         */
        ValidationDemoChildBean demoChildBean2 = new ValidationDemoChildBean();
        demoChildBean2.setHeight(500);
        demoChildBean2.setPhone("13112345678");
        demoChildBeanList.add(demoChildBean2);
        /**
         * case 3 测试正则
         */
        ValidationDemoChildBean demoChildBean3 = new ValidationDemoChildBean();
        demoChildBean3.setHeight(130);
        demoChildBean3.setPhone("123456789");
        demoChildBeanList.add(demoChildBean3);
        /***
         * case 4 测试全部符合要求
         */
        ValidationDemoChildBean demoChildBean4 = new ValidationDemoChildBean();
        demoChildBean4.setHeight(140);
        demoChildBean4.setPhone("13112345678");
        demoChildBeanList.add(demoChildBean4);
        /**
         * case 5 测试邮箱
         */
        ValidationDemoBean demoBean5 = new ValidationDemoBean();
        demoBean5.setUserName("tomcat5");
        demoBean5.setAge(5);
        demoBean5.setEmail("demo.demo");
        demoBean5.setChildBean(demoChildBean4);
        demoBeanList.add(demoBean5);
        /**
         * case 6 测试对象属性非空
         */
        ValidationDemoBean demoBean6 = new ValidationDemoBean();
        demoBean6.setUserName("tomcat6");
        demoBean6.setAge(6);
        demoBean6.setEmail("[email protected]");
        demoBeanList.add(demoBean6);
        /**
         * case 7 测试对象属性中的属性
         */
        ValidationDemoBean demoBean7 = new ValidationDemoBean();
        demoBean7.setUserName("tomcat7");
        demoBean7.setAge(7);
        demoBean7.setEmail("[email protected]");
        ValidationDemoChildBean demoChildBean7 = new ValidationDemoChildBean();
        demoChildBean7.setHeight(170);
        demoBean7.setChildBean(demoChildBean7);
        demoBeanList.add(demoBean7);

        for (int i = 0; i < demoChildBeanList.size(); i++) {
            String validResult = BeanValidateUtil.validate(demoChildBeanList.get(i));
            logger.debug("case {} : {}", i, validResult);
        }
        for (int j = 0; j < demoBeanList.size(); j++) {
            String validResult = BeanValidateUtil.validate(demoBeanList.get(j));
            logger.debug("case {} : {}", (j + 5), validResult);
        }

    }
}

5 测试结果

2018-12-16 19:10:03:043 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 0 : [phone]手机号不符合要求
2018-12-16 19:10:03:072 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 1 : [phone]手机号不能为空
2018-12-16 19:10:03:092 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 2 : [height]最大值不超过 300
2018-12-16 19:10:03:110 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 3 : [phone]手机号不符合要求
2018-12-16 19:10:03:125 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 88) -case 4 : null
2018-12-16 19:10:03:163 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 92) -case 5 : [email]邮箱格式不正确
2018-12-16 19:10:03:200 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 92) -case 6 : [childBean]childBean 不能为空
2018-12-16 19:10:03:221 [main] DEBUG com.ljq.demo.util.BeanValidateUtilTest(BeanValidateUtilTest.java 92) -case 7 : [childBean.phone]手机号不能为空

—— update 2018-12-16