一、引入pom依赖

<!-- validator -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>

二、针对需要验证的字段封装为TestVo

@Data
public class TestVo { @NotNull
private Integer id ; @NotBlank
private String name;
}

三、工具类BeanValidator编写

 public class BeanValidator {

     private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

     /**
* 校验对象
* @param t 对象的泛型
* @param groups
* @param <T>
* @return
*/
public static <T>Map<String,String> validate(T t,Class... groups){
Validator validator = validatorFactory.getValidator();
Set validateResult = validator.validate(t, groups);
if(validateResult.isEmpty()){
return Collections.emptyMap();
}else {
LinkedHashMap errors = Maps.newLinkedHashMap();
Iterator iterator = validateResult.iterator();
while (iterator.hasNext()){
ConstraintViolation violation = (ConstraintViolation) iterator.next();
errors.put(violation.getPropertyPath().toString(),violation.getMessage());
}
return errors;
}
} /**
* 校验集合
* @param collection 集合
* @return
*/
public static Map<String,String> validateList(Collection<?> collection){
Preconditions.checkNotNull(collection);
Iterator iterator = collection.iterator();
Map errors;
do{
if (!iterator.hasNext()) {
return Collections.emptyMap();
}
Object object = iterator.next();
errors = validate(object,new Class[0]);
}while (errors.isEmpty()); // 如果errors为空则循环校验,一旦不为空 跳出循环
return errors;
} /**
* 通用方法,至少传入一个Object参数
* <p>校验参数之后不会处理只会将错误信息存储到map中
* @param first
* @param objects
*/
public static Map<String,String> validateObject(Object first,Object... objects){
if(objects == null || objects.length == 0){
return validate(first,new Class[0]);
}else {
return validateList(Lists.asList(first,objects));
}
} /**
* 校验参数是否合法
* <p>当校验参数不合法时抛出异常让程序不能继续执行
* @param param
* @throws ParamException
*/
public static void check(Object param)throws ParamException{
Map<String, String> map = validateObject(param);
if(MapUtils.isNotEmpty(map)){
throw new ParamException(map.toString());
}
}
}

四、Controller类中调用并测试

@Controller
@Slf4j
@RequestMapping("/test")
public class TestController { @RequestMapping("/testVo.json")
@ResponseBody
public String testVo(TestVo testVo)throws ParamException{
log.info("testVo");
Map<String, String> map = BeanValidator.validateObject(testVo);
if(MapUtils.isNotEmpty(map)){
for(Map.Entry<String,String> entry :map.entrySet()){
log.error("error==={}-->{}",entry.getKey(),entry.getValue());
}
}
//BeanValidator.check(testVo);
return "hello world";
} }

运行就会输出这样的日志信息:

JSR303完成validate校验并编写BeanValidator工具类的更多相关文章

  1. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

  2. 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能

    相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domai ...

  3. 使用JDK的zip编写打包工具类

    JDK自带的zip AIP在java.util.zip包下面,主要有以下几个类: java.util.zip.ZipEntryjava.util.zip.ZipInputStreamjava.util ...

  4. JDBC_part2_DML以及预编译_编写DBUtil工具类

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! jdbc day02 DML语法 比起插叙语句,没有R ...

  5. 编写自己的validate校验框架原理(转)

    原文链接:http://blog.csdn.net/a973893384/article/details/51517388 具体思路: 我们使用自定义注解实现.然后需要解决的是两个问题: 1是如何扫描 ...

  6. SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑

    (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...

  7. kettle系列-4.kettle定制化开发工具类

    要说的话这个工具类还是比较简单的,每个方法体都比较小,但用起来还是可以的,把开发中一些常用的步骤封装了下,不用去kettle源码中找相关操作的具体实现了. 算了废话不多了,直接上重点,代码如下: im ...

  8. Lucene第二篇【抽取工具类、索引库优化、分词器、高亮、摘要、排序、多条件搜索】

    对Lucene代码优化 我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的: 以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了.是重复代码! Directory dire ...

  9. 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类

    一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...

随机推荐

  1. Java中请优先使用try-with-resources而非try-finally

    Java中请优先使用try-with-resources而非try-finally Java库包含了很多需要手工调用close方法来关闭的资源.比如说InputStream.OutputStream及 ...

  2. Python GUI wxPython StaticText控件背景色透明

    import wx class TransparentStaticText(wx.StaticText): """ 重写StaticText控件 "" ...

  3. 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ...

  4. 洛谷 P5596 【XR-4】题 题解

    原题链接 本题只要 推式子 就可以了. \[y^2-x^2=ax + b \] \[a x + x^2 = y^2 - b \] \[4 x^2 + 4 ax = 4 y^2 - 4b \] \[(2 ...

  5. 浅谈VUE,使用watch方法监听父组件传到子组件的数据。

    props:['updateData'], data(){ return{ form: { _name:'', }, } }, 第一步接收数据: props:['updateData']   第二步动 ...

  6. javascript正则表达式入门先了解这些

    前言 此内容由学习<JavaScript正则表达式迷你书(1.1版)>整理而来(于2020年3月30日看完).此外还参考了MDN上关于Regex和String的相关内容,还有ECMAScr ...

  7. 十 | 门控循环神经网络LSTM与GRU(附python演练)

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 门控循环神经网络简介 长短期记忆网络(LSTM) 门控制循环单元(GRU) ...

  8. 面试指南」JS 模块化、组件化、工程化相关的 15 道面试题

    JS 模块化.组件化.工程化相关的 15 道面试题 1.什么是模块化? 2.简述模块化的发展历程? 3.AMD.CMD.CommonJS 与 ES6 模块化的区别? 4.它们是如何使用的? 5.exp ...

  9. 骑士cms-通读全文-代码审计

    版本号:3.5.1 下载地址:http://103.45.101.75:66/2/201412/74cms.rar 1.审计方法 通读审计 1.1查看文件结构 首先需要看看有哪些文件和文件夹,寻找名称 ...

  10. 用Arcgis缓存文件发布服务

    切片文件类型为: 其中_alllayers中为各等级的切片文件,xml文件为切片信息(级别).发布服务的步骤如下: 1.将文件拷贝到服务器上: 2.将gdb和xml文件拷贝出来,放到桌面上: 3.打开 ...