需要掌握:
实现
依赖
使用的是规范 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