ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA高效编程九(验证框架)

2021-01-18 21:05:30  阅读:236  来源: 互联网

标签:JAVA 验证 编程 private class UserInfo public userInfo


                  

 

 

 

 

 

 

编程规范的那些常见词

                          

 

 

校验之BV,HV,SV 

                         

 

 

常用约束注解

                       

 

 

初级,中级,高级注解

                                           

 

 

注解实战

/**
* 待验证对象实体类
* 用户信息类
*/
public class UserInfo {

// 登录场景
public interface LoginGroup {}

// 注册场景
public interface RegisterGroup {}

// 组排序场景
@GroupSequence({
LoginGroup.class,
RegisterGroup.class,
Default.class
})
public interface Group {}

/**
* 用户ID
*/
@NotNull(message = "用户ID不能为空",
groups = LoginGroup.class)
private String userId;

/**
* 用户名
* NotEmpty 不会自动去掉前后空格
*/
@NotEmpty(message = "用户名称不能为空")
private String userName;

/**
* 用户密码
* NotBlank 自动去掉字符串前后空格后验证是否为空
*/
@NotBlank(message = "用户密码不能为空")
@Length(min = 6, max = 20,
message = "密码长度不能少于6位,多于20位")
private String passWord;

/**
* 邮箱
*/
@NotNull(message = "邮箱不能为空",
groups = RegisterGroup.class)
@Email(message = "邮箱必须为有效邮箱")
private String email;

/**
* 手机号
*/
@Phone(message = "手机号不是158后头随便")
private String phone;

/**
* 年龄
*/
@Min(value = 18, message = "年龄不能小于18岁")
@Max(value = 60, message = "年龄不能大于60岁")
private Integer age;

/**
* 生日
*/
@Past(message = "生日不能为未来或当前时间点")
private Date birthday;

/**
* 好友列表
*/
@Size(min = 1, message = "不能少于1个好友")
private List<@Valid UserInfo> friends;

}



/**
* 验证测试类
*/
public class ValidationTest {

// 验证器对象
private Validator validator;
// 待验证对象
private UserInfo userInfo;
// 验证结果集合
private Set<ConstraintViolation<UserInfo>> set;
// 验证结果集合
private Set<ConstraintViolation<UserInfoService>> otherSet;

/**
* 初始化操作
*/
@Before
public void init() {
// 初始化验证器
validator = Validation.buildDefaultValidatorFactory()
.getValidator();

// 初始化待验证对象 - 用户信息
userInfo = new UserInfo();
// userInfo.setUserId("zhangxiaoxi");
userInfo.setUserName("张小喜");
userInfo.setPassWord("zhangxiaoxi");
// userInfo.setEmail("zhangxiaoxi@sina.cn");
userInfo.setAge(30);
Calendar calendar = Calendar.getInstance();
calendar.set(2012, 1, 1);
userInfo.setBirthday(calendar.getTime());

userInfo.setPhone("15800000000");

UserInfo friend = new UserInfo();
// friend.setUserId("wangxiaoxi");
friend.setUserName("王小喜");
friend.setPassWord("wangxiaoxi");
// friend.setEmail("wangxiaoxi@sina.cn");
friend.setPhone("15811111111");

userInfo.setFriends(new ArrayList(){{add(friend);}});
}

/**
* 结果打印
*/
@After
public void print() {
set.forEach(item -> {
// 输出验证错误信息
System.out.println(item.getMessage());
});

}

@Test
public void nullValidation() {
// 使用验证器对对象进行验证
set = validator.validate(userInfo);
}

/**
* 级联验证测试方法
*/
@Test
public void graphValidation() {
set = validator.validate(userInfo);
}

/**
* 分组验证测试方法
*/
@Test
public void groupValidation() {
set = validator.validate(userInfo,
UserInfo.RegisterGroup.class,
UserInfo.LoginGroup.class);
}

/**
* 组序列
*/
@Test
public void groupSequenceValidation() {
set = validator.validate(userInfo,
UserInfo.Group.class);
}

/**
* 对方法输入参数进行约束注解校验
*/
@Test
public void paramValidation() throws NoSuchMethodException {
// 获取校验执行器
ExecutableValidator executableValidator =
validator.forExecutables();

// 待验证对象
UserInfoService service = new UserInfoService();
// 待验证方法
Method method = service.getClass()
.getMethod("setUserInfo", UserInfo.class);
// 方法输入参数
Object[] paramObjects = new Object[]{new UserInfo()};

// 对方法的输入参数进行校验
otherSet = executableValidator.validateParameters(
service,
method,
paramObjects);
}


/**
* 对方法返回值进行约束校验
*/
@Test
public void returnValueValidation()
throws NoSuchMethodException,
InvocationTargetException, IllegalAccessException {

// 获取校验执行器
ExecutableValidator executableValidator =
validator.forExecutables();

// 构造要验证的方法对象
UserInfoService service = new UserInfoService();
Method method = service.getClass()
.getMethod("getUserInfo");

// 调用方法得到返回值
Object returnValue = method.invoke(service);

// 校验方法返回值是否符合约束
otherSet = executableValidator.validateReturnValue(
service,
method,
returnValue);
}

/**
* 对构造函数输入参数进行校验
*/
@Test
public void constructorValidation()
throws NoSuchMethodException {

// 获取验证执行器
ExecutableValidator executableValidator =
validator.forExecutables();

// 获取构造函数
Constructor constructor =
UserInfoService.class
.getConstructor(UserInfo.class);
Object[] paramObjects = new Object[]{new UserInfo()};

// 校验构造函数
otherSet = executableValidator
.validateConstructorParameters(
constructor, paramObjects);

}

}




/**
* 用户信息服务类,单元测试方法不能带参数和返回值,用于高级注解验证
*/
public class UserInfoService {

/**
* UserInfo 作为输入参数
* @param userInfo
*/
public void setUserInfo(@Valid UserInfo userInfo) {}

/**
* UserInfo 作为输出参数
* @return
*/
public @Valid UserInfo getUserInfo() {
return new UserInfo();
}

/**
* 默认构造函数
*/
public UserInfoService() {}

/**
* 接收UserInfo作为参数的构造函数
* @param userInfo
*/
public UserInfoService(@Valid UserInfo userInfo) {}

}

自定义手机号验证

                                               

 

 

/**
* 自定义手机号约束注解
*/
@Documented
// 注解的作用目标
@Target({ElementType.FIELD})
// 注解的保留策略
@Retention(RetentionPolicy.RUNTIME)
// 不同之处:与约束注解关联的验证器
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {

// 约束注解验证时的输出信息
String message() default "手机号校验错误";

// 约束注解在验证时所属的组别
Class<?>[] groups() default {};

// 约束注解的有效负载
Class<? extends Payload>[] payload() default {};
}



/**
* 自定义手机号约束注解关联验证器
*/
public class PhoneValidator
implements ConstraintValidator<Phone, String> {

/**
* 自定义校验逻辑方法
* @param value
* @param context
* @return
*/
@Override
public boolean isValid(String value,
ConstraintValidatorContext context) {

// 手机号验证规则:158后头随便
String check = "158\\d{8}";
Pattern regex = Pattern.compile(check);

// 空值处理
String phone = Optional.ofNullable(value).orElse("");
Matcher matcher = regex.matcher(phone);

return matcher.matches();
}
}

标签:JAVA,验证,编程,private,class,UserInfo,public,userInfo
来源: https://www.cnblogs.com/hongzuiliyu/p/14295152.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有