自定义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";
}
}

自定义Java Validator的更多相关文章

  1. Java validator整理

    Java validator整理 因为想对方法的入参和出参作简单的非空或者非空字符做校验,所以找了下相关的@NotNull注解 类 | 说明 --- | --- javax.validation.co ...

  2. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  3. paip.自定义java 泛型类与泛型方法的实现总结

    paip.自定义java 泛型类与泛型方法的实现总结 ============泛型方法     public static <atiType,retType> retType reduce ...

  4. 集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序的条码控件Java Barcode Package

    Java Barcode Package控件是一款条码生成控件,包含所有的JavaBean,Applets,Servlets和类库可以使用于装有Java虚拟机的任何平台,包括Windows®, Lin ...

  5. 1.5.4、CDH 搭建Hadoop在安装之前(定制安装解决方案---配置自定义Java主目录位置)

    配置自定义Java主目录位置 注意: Cloudera强烈建议安装JDK/ usr / java / jdk-version,允许Cloudera Manager自动检测并使用正确的JDK版本.如果在 ...

  6. 如何在Mirth Connect中创建和调用自定义Java代码

    0-前言 本文章将向您展示如何创建自定义Java类,将其编译/打包到JAR中,将其包含在Mirth Connect在,并在JavaScript中调用它,您可以从任何JavaScript上下文调用自定义 ...

  7. php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决

    php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...

  8. 自定义Java集合

    一.泛型 1.在JDK1.4以前,所有的集合元素全都按照Object来存储,拿出来还要进行强制转型.由于这样的做法有太多的缺点,容易出现ClassCaseException,不安全,让人不省心,于是乎 ...

  9. cas sso单点登录系列3_cas-server端配置认证方式实践(数据源+自定义java类认证)

    转:http://blog.csdn.net/ae6623/article/details/8851801 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2 ...

随机推荐

  1. JAVA记事本的图形用户界面应用程序含加密

    JAVA记事本的图形用户界面应用程序 加密 题目简介: 整体分析: 实验代码: import java.awt.EventQueue; import java.awt.event.ActionEven ...

  2. linux系统中vi点击上下左右键后出现ABCD,没有移动光标

    终端(terminal)中输入 vi /etc /vim/vimrc.tiny 在打开的文件中修改 1. 将 set compatible  修改为  set nocompatible 在下一行加入 ...

  3. mysql双主架构

    注意:最好不要用innodedb来同步数据库,要用databus来同步数据库,数据量大要用上mycat中间件 Mysql主主同步环境部署: centos 7.4 三台云主机: mysql1 :10.1 ...

  4. 掌握Pod-Pod调度策略

    一 Pod生命周期管理 1.1 Pod生命周期 Pod在整个生命周期过程中被系统定义了如下各种状态. 状态值 描述 Pending API Server已经创建该Pod,且Pod内还有一个或多个容器的 ...

  5. PTA --- 天梯赛 L1-064 估值一亿的AI核心代码

    L1-064 估值一亿的AI核心代码 (20 point(s)) 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多 ...

  6. 【AMAD】betamax -- 一个ruby-VCR的模仿品,只支持requests

    简介 动机 作用 用法 个人评分 简介 betamax1会记录你的HTTP操作,可以让你在测试的时候不必重复进行真实的请求. 动机 如果你的代码需要和外部资源一起运作,那么测试这段代码的方法就叫做集成 ...

  7. python基础--合并两个列表

    a = [1,2,3] b = [4,5,6] # 将两个列表合并 # append方法是不行的 # a.append(b) # print(a) # [1, 2, 3, [4, 5, 6]] # 我 ...

  8. elastic mapping not_analyzed 简单理解 + analysis-ik分词器安装

    1.索引index ,这个参数可以控制字段应该怎样建索引,怎样查询.它有以下三个可用值: not_analyzed:将字段的原始值放入索引中,作为一个独立的term,它是除string字段以外的所有字 ...

  9. AI 资源帖

    https://github.com/mnielsen/neural-networks-and-deep-learning openCV笔记 https://blog.csdn.net/qq_2689 ...

  10. python 爬虫 urllib模块 发起post请求

    urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...