自定义Java Validator
自定义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的更多相关文章
- Java validator整理
Java validator整理 因为想对方法的入参和出参作简单的非空或者非空字符做校验,所以找了下相关的@NotNull注解 类 | 说明 --- | --- javax.validation.co ...
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...
- paip.自定义java 泛型类与泛型方法的实现总结
paip.自定义java 泛型类与泛型方法的实现总结 ============泛型方法 public static <atiType,retType> retType reduce ...
- 集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序的条码控件Java Barcode Package
Java Barcode Package控件是一款条码生成控件,包含所有的JavaBean,Applets,Servlets和类库可以使用于装有Java虚拟机的任何平台,包括Windows®, Lin ...
- 1.5.4、CDH 搭建Hadoop在安装之前(定制安装解决方案---配置自定义Java主目录位置)
配置自定义Java主目录位置 注意: Cloudera强烈建议安装JDK/ usr / java / jdk-version,允许Cloudera Manager自动检测并使用正确的JDK版本.如果在 ...
- 如何在Mirth Connect中创建和调用自定义Java代码
0-前言 本文章将向您展示如何创建自定义Java类,将其编译/打包到JAR中,将其包含在Mirth Connect在,并在JavaScript中调用它,您可以从任何JavaScript上下文调用自定义 ...
- php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决
php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...
- 自定义Java集合
一.泛型 1.在JDK1.4以前,所有的集合元素全都按照Object来存储,拿出来还要进行强制转型.由于这样的做法有太多的缺点,容易出现ClassCaseException,不安全,让人不省心,于是乎 ...
- cas sso单点登录系列3_cas-server端配置认证方式实践(数据源+自定义java类认证)
转:http://blog.csdn.net/ae6623/article/details/8851801 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2 ...
随机推荐
- SqlServer索引的原理与应用(转载)
SqlServer索引的原理与应用 索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类 ...
- wmic查询ip
@echo off for /F "usebackq" %%R in (`wmic PATH Win32_NetworkAdapterConfiguration WHERE &qu ...
- IPv4正则表达式
apache common-httpclient-4.5.2.jar package org.apache.http.conn.util; public class InetAddressUtils ...
- Kibana 创建索引 POST 403 (forbidden) on create index
一.问题描述: Kibana创建索引:kibana > management > index patterns > create index pattern 索引名称: mercha ...
- 问题 1014: [编程入门]阶乘求和python):(本地测试正确;但提交不对!!??)求教
问题 1014: [编程入门]阶乘求和 时间限制: 1Sec 内存限制: 128MB 提交: 27629 解决: 5450 题目描述 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数 ...
- HTML Img标签 src为网络地址无法显示图片问题解决(https)
举例说明: <img src="https://pic.cnblogs.com/avatar/1549846/20191126100502.png" alt="加载 ...
- Linux 中账户管理
账户管理涉及到三个文件: 1./etc/passwd yy@ubuntu:~$ head -n 3 /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x ...
- SolidWorks学习笔记6抽壳,加强筋,扫描,放样
抽壳 概念:移除一个或者多个面,然后将其余的模型外表面向内或者向外偏移相等或者不等的距离 针对不同面设置不同厚度 方向参考 有实体的一侧是内测, 没有实体的一侧是外侧 顺序 先圆角再抽壳 加强筋. 点 ...
- sqlalchemy orm的cascade的参数
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text ...
- python 爬虫 基于requests模块发起ajax的get请求
基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...