Hibernate Validation 数据校验案例(java工程)

需要掌握:

实现

依赖

使用的是规范 2.0,搭配 hibernate validator 6 版本

<dependencies>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.16.Final</version>
    </dependency>

</dependencies>

校验工具类

更多方法详见:
https://www.jianshu.com/p/3267689ebf1b

package std;

import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;

import javax.validation.*;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.stream.Collectors;


/**
 * 使用hibernate validate进行校验
 */
public class HibernateValidatorUtil {

    private static final ValidatorFactory FACTORY = getValidatorFactory();

    /**
     * 校验bean的成员变量,如果不符合校验规则,就抛出异常
     *
     * @param object 被校验的参数
     * @param groups 组
     * @throws ConstraintViolationException 如果校验不成功则抛出异常
     */
    public static <T> void validateBean(T object, Class... groups) {
        //获得验证器
        Validator validator = FACTORY.getValidator();
        //执行验证
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, groups);
        //如果有验证信息,则将第一个取出来包装成异常返回
        if(constraintViolations!=null && !constraintViolations.isEmpty()){
            throw new ConstraintViolationException(constraintViolations);
        }
    }
    /**
     * 校验方法参数,如果不符合校验规则,就抛出异常
     *
     * @param object 校验的对象
     * @param method 校验的方法
     * @param parameters 校验的方法的参数
     * @param groups 组
     * @throws ConstraintViolationException 如果校验不成功则抛出异常
     */
    public static <T> void validateMethod(T object, Method method,Object[] parameters, Class... groups) {
        //获得验证器
        Validator validator = FACTORY.getValidator();
        ExecutableValidator executableValidator = validator.forExecutables();
        //执行验证
        Set<ConstraintViolation<T>> constraintViolations = executableValidator.validateParameters(
                object, method, parameters,groups);
        //如果有验证信息,则将第一个取出来包装成异常返回
        if(constraintViolations!=null && !constraintViolations.isEmpty()){
            throw new ConstraintViolationException(constraintViolations);
        }
    }

    /**
     * 获得验证器工厂对象
     * @return
     */
    private static ValidatorFactory getValidatorFactory(){

        //获得验证器
        ValidatorFactory factory = Validation.byDefaultProvider()
                .configure()
                .messageInterpolator(new ParameterMessageInterpolator())
                .buildValidatorFactory();
        return factory;
    }


    /**
     * 从 ConstraintViolation 获取 message提示信息
     * @param set
     * @return
     */
    public static String getMessage(Set<ConstraintViolation<?>> set){
        String res = set
                .stream()
                .map( cv -> {
                        return cv == null ? null : cv.getMessage();
                    })
                .collect(Collectors.joining(", "));

        return res;
    }
}

测试-对实体类进行校验

实体类

在实体类的成员变量上加上要校验的注解

package std;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class User {
    private long id;
    @NotNull(message = "登录名不能为空")
    @Size(min = 3, max = 16, message = "登录名长度必须在3-16之间")
    private String username;
    @NotNull(message = "密码不能为空")
    @Size(min = 5, max = 16, message = "密码长度必须在5-16之间")
    private String password;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

测试类

package std;

public class T1校验bean成员变量 {
    public static void main(String[] args) {
        User demo = new User();
        demo.setUsername("ad");
        demo.setPassword("126");

        try {
            HibernateValidatorUtil.validateBean(demo);
        }catch (ConstraintViolationException e){
            System.out.println(e.getMessage());
        }
        System.out.println();
    }
}

测试-对方法的参数进行校验

要校验的类

注意:如果形参是bean,必须加上 @Valid 注解,才会进行校验

package std;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class Login {

    public boolean doLogin1(@NotNull(message = "登录名不能为空") String username,
                            @NotNull(message = "密码不能为空")
                            @Size(min = 6,max = 20,message = "密码长度必须大于6个字符,小于20个字符")
                            String password){

        return false;
    }
    // 如果形参是bean,必须加上 @Valid 注解,才会进行校验
    public boolean doLogin2(@Valid User user){

        return false;
    }
}

测试类 - 对方法的形参是字符串类型进行校验

package std;

import java.lang.reflect.Method;

public class T2校验方法形参_字符串 {
    public static void main(String[] args) throws NoSuchMethodException {
        Login login = new Login();

        Method method = login.getClass().getMethod("doLogin1", String.class, String.class);
        Object[] parameter = {null,"123"};
        try {
            HibernateValidatorUtil.validateMethod(login,method,parameter);
        }catch (ConstraintViolationException e){
            String msg = HibernateValidatorUtil.getMessage(e.getConstraintViolations());
            System.out.println(msg);
        }
        System.out.println();
    }
}

测试类 - 对方法的形参是bean类型进行校验

package std;

import java.lang.reflect.Method;

public class T3校验方法形参_bean {
    public static void main(String[] args) throws NoSuchMethodException {
        Login login = new Login();

        Method method = login.getClass().getMethod("doLogin2", User.class);

        User user = new User();
        user.setUsername(null);
        user.setPassword("1234");

        Object[] parameter = {user};
        try {
            HibernateValidatorUtil.validateMethod(login,method,parameter);
        }catch (ConstraintViolationException e){
            String msg = HibernateValidatorUtil.getMessage(e.getConstraintViolations());
            System.out.println(msg);
        }
        System.out.println();
    }
}

参考:
https://blog.csdn.net/hjnjmjkj/article/details/100553957
https://www.jianshu.com/p/3267689ebf1b


原文出处:/show_1IX74yC7ON6N.html