自定义Java Validator

在项目中,针对汉字的长度计算,数据库和java的计算方式不一致,需要重新处理下java 的 Validator,使其满足项目

建立自定义的 validator annotation

@Target({METHOD, FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = SizeValidator.class) // 对应的验证class
public @interface DbSize { String message() default "{javax.validation.constraints.Size.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; /**
* @return size the element must be higher or equal to
*/
int min() default 0; /**
* @return size the element must be lower or equal to
*/
int max() default Integer.MAX_VALUE; }

创建验证的执行类

public class DbSizeValidator implements ConstraintValidator<DbSize, String> {

    @Value("${db.charset:GBK}")
private String charset; private DbSize size; @Override
public void initialize(DbSize constraintAnnotation) {
this.size = constraintAnnotation;
} /**
* Implements the validation logic.
* The state of {@code value} must not be altered.
* <p>
* This method can be accessed concurrently, thread-safety must be ensured
* by the implementation.
*
* @param value object to validate
* @param context context in which the constraint is evaluated
* @return {@code false} if {@code value} does not pass the constraint
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null || "".equals(value)) {
return size.min() == 0 ? true : false;
}
int length = 0;
try {
length = value.getBytes(charset).length;
} catch (Exception e) {
try {
length = value.getBytes(Charset.forName("GBK")).length;
} catch (Exception e1){
// 如果失败,jvm就直接狗带了,不需要了
length = value.getBytes().length;
}
}
return (length > size.max() || length < size.min()) ? false : true;
}
}

测试

public class DbSizeValidatorTest {

    @Test
public void validatorTest() {
ValidationModel model = new ValidationModel();
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
Set<ConstraintViolation<ValidationModel>> validate = validator.validate(model);
List<String> messageList = new ArrayList<>();
for (ConstraintViolation<ValidationModel> constraintViolation : validate) {
messageList.add(constraintViolation.getMessage());
} Assertions.assertEquals(true, messageList.stream().map(el -> "请使用类型".equals(el)).count() == 1);
messageList.stream().forEach(System.out::println);
} @Data
private class ValidationModel {
@DbSize(max = 2, message = "请使用类型")
private String xdoSize = "错误"; @DbSize(max = 2, message = "xdoSize正确")
private String xdoSize1 = "对"; @DbSize(max = 5, message = "xdoSizeEn正确")
private String xdoSize2 = "对aB2";
}
}

最新文章

  1. c#常用方法
  2. mysql if case条件更新
  3. Linux配置VNC实现远程图形化操纵
  4. DIV下的DIV居中
  5. format when printing
  6. C# 操作 Excel 常见问题收集和整理
  7. 关于IMP由拥有DBA权限的用户EXP数据时,数据存放表空间的几种情况(IMP-00013) -1
  8. 【Unity3D与23种设计模式】享元模式(Flyweight)
  9. windows10滑轮bug
  10. [Swift]LeetCode436. 寻找右区间 | Find Right Interval
  11. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换
  12. Mysql 利用拷贝data目录文件的方式迁移mysql数据库
  13. redis 的简单用法
  14. ios-复制字符串到剪贴板
  15. Ubuntu安装mysql及设置远程访问方法
  16. JS中JSON对象和JSON字符串的相互转化
  17. cesium编程中级开篇
  18. Sqlserver新建随机测试数据
  19. list 移除值
  20. 转:GitHub 万星推荐成长技术清单

热门文章

  1. 在Latex中插入Python代码
  2. tensorflow二进制文件读取与tfrecords文件读取
  3. linux卸载Python3
  4. C/C++之编程语言学习资源
  5. JS进阶学习&lt;一&gt;
  6. python去掉空格和 b
  7. Window Relationships and Frames
  8. JavaScript基础入门06
  9. Windows Server 中配置权威时间服务器
  10. 【机器学习】Learning to Rank 简介