代码编织梦想

但是 hibernate-validator 在使用过程中,依然会存在一些问题。

validator 在 hibernate-validator 等校验工具之上,做了一些改进,使其使用更加便捷优雅,进一步提升工作效率。

图片

变更日志
变更日志
特性
支持 fluent-validation
支持 jsr-303 注解
支持 i18n
支持用户自定义策略
支持用户自定义注解
支持针对属性的校验
支持过程式编程与注解式编程
支持指定校验生效的条件
创作目的
hibernate-validator 无法满足的场景
如今 java 最流行的 hibernate-validator 框架,但是有些场景是无法满足的。

比如:
https://www.python.org/users/atdrsxs/
https://www.python.org/users/xgegyfh/
https://www.python.org/users/cdcabau/
https://www.python.org/users/xmcktbn/
https://www.python.org/users/dnckjrr/
https://www.python.org/users/htdirpm/
https://www.python.org/users/qvfsfza/
https://www.python.org/users/csxudue/
https://www.python.org/users/jlmevyt/
https://www.python.org/users/tdmejmc/
https://www.python.org/users/uedfxza/
https://www.python.org/users/gtnpkst/
https://www.python.org/users/sssrblo/
https://www.python.org/users/dgkxgxc/
https://www.python.org/users/zsnjruu/
https://www.python.org/users/squieui/
https://www.python.org/users/clflugm/
https://www.python.org/users/befurny/
https://www.python.org/users/dpwuatb/
https://www.python.org/users/eboentu/
https://www.python.org/users/czcd2023/

验证新密码和确认密码是否相同。(同一对象下的不同属性之间关系)
当一个属性值满足某个条件时,才进行其他值的参数校验。
多个属性值,至少有一个不能为 null
其实,在对于多个字段的关联关系处理时,hibernate-validator 就会比较弱。

本项目结合原有的优点,进行这一点的功能强化。

validation-api 过于复杂
validation-api 提供了丰富的特性定义,也同时带来了一个问题。

实现起来,特别复杂。

然而我们实际使用中,常常不需要这么复杂的实现。

validator-api 提供了一套简化很多的 api,便于用户自行实现。

自定义缺乏灵活性
hibernate-validator 在使用中,自定义约束实现是基于注解的,针对单个属性校验不够灵活。

本项目中,将属性校验约束和注解约束区分开,便于复用和拓展。

过程式编程 vs 注解式编程
hibernate-validator 核心支持的是注解式编程,基于 bean 的校验。

一个问题是针对属性校验不灵活,有时候针对 bean 的校验,还是要自己写判断。

本项目支持 fluent-api 进行过程式编程,同时支持注解式编程。

尽可能兼顾灵活性与便利性。

快速开始
准备工作
JDK1.7+

Maven 3.X+

maven 引入

com.github.houbb
validator-core
0.4.0

快速入门
定义对象
第一步,我们定义一个常见的 java bean 对象,可以指定内置的注解。

支持 jsr-303 注解和 hibernate-validator 的注解。

public class User {

/**
 * 名称
 */
@HasNotNull({"nickName"})
private String name;

/**
 * 昵称
 */
private String nickName;

/**
 * 原始密码
 */
@AllEquals("password2")
private String password;

/**
 * 新密码
 */
private String password2;

/**
 * 性别
 */
@Ranges({"boy", "girl"})
private String sex;

/**
 * 失败类型枚举
 */
@EnumRanges(FailTypeEnum.class)
private String failType;

//getter & setter

}
ValidHelper 工具方法
ValidHelper 作为统一封装的工具类,提供了 java bean 校验常见的方法。

方法列表:

序号 方法 返回值 说明
1 failOver(Object object) IResult 全部验证后返回
2 failFast(Object object) IResult 快速验证后返回
3 failOverThrow(Object object) void 全部验证后返回-未通过抛出 ValidRuntimeException 异常
4 failFastThrow(Object object) void 快速验证后返回-未通过抛出 ValidRuntimeException 异常
使用起来很简单,我们以 failFast 为例:

// 对象定义
User user = new User();
user.sex(“what”).password(“old”).password2(“new”);

// 调用方法
IResult result = ValidHelper.failFast(user);
结果:

DefaultResult{pass=false, notPassList=[DefaultConstraintResult{pass=false, message=‘name: 值 不是预期值’, value=null, constraint=‘HasNotNullConstraint’, expectValue=‘’, fieldName=‘name’}], allList=null}
IResult 方法说明
返回值实现默认为 DefaultResult,接口 IResult 属性如下:

public interface IResult {

/**
 * 是否全部通过验证
 * @return 是否
 * @since 0.1.0
 */
boolean pass();

/**
 * 未通过的列表信息
 * @return 验证结果
 * @since 0.1.0
 */
List<IConstraintResult> notPassList();

/**
 * 所有的验证结果列表
 * @return 所有的验证结果
 * @since 0.1.0
 */
List<IConstraintResult> allList();

/**
 * 输出信息到控台
 * (1)主要是为了方便调整
 * (2)该功能其实可以做增强,比如输出到文件/数据库等等。
 * @return this
 * @since 0.0.6
 */
IResult print();

/**
 * 对于未通过的信息,
 * (1)未通过的界定。
 *  {@link IConstraintResult#pass()} 为 false
 *
 * (2)内容信息
 * 抛出运行时异常 {@link com.github.houbb.validator.api.exception.ValidRuntimeException},异常信息为 {@link IConstraintResult#message()} 消息
 * (3)内容限定
 *  为了避免异常内容过多,只抛出第一条即可。
 *  (4)改方法的增强空间
 *  4.1 可以指定什么情况下抛出异常
 *  4.2 抛出异常的信息和类别
 *
 * @return this
 * @since 0.0.6
 */
IResult throwsEx();

}
注解说明
java bean 的校验,基于注解是比较方便的。和 hibernate-validator 使用类似,这里介绍下常见的注解。

内置约束注解
内置注解如下:

序号 注解 value() 说明
1 @AllEquals String[] 当前字段及其指定的字段 全部相等
2 @EnumRanges Class<? extends Enum> 当前字段必须在枚举值指定的范围内
3 @HasNotNull String[] 当前字段及其指定的字段 至少有一个不为 null
4 @Ranges String[] 当前字段必须在指定的范围内
JSR-303 + hibernate-validator 约束注解支持
序号 注解 说明
1 @AssertTrue 为 true 约束条件
2 @AssertFalse 为 false 约束条件
3 @Null 为 null 约束条件
4 @NotNull 不为 null 约束条件
5 @Past 是否在当前时间之前约束条件
6 @Future 是否在当前时间之后约束条件
7 @Pattern 正则表达式约束条件
8 @Size 在指定范围内的约束条件
9 @Digits 数字位数的约束条件
10 @DecimalMax 最大数字的约束条件
11 @DecimalMin 最小数字的约束条件
12 @Min 最小的约束条件
13 @Max 最大的约束条件
13 @NotBlank 不能为空格的约束条件
14 @NotEmpty 不能为空的约束条件
15 @Length 长度的约束条件
16 @CNPJ CNPJ 约束条件
17 @CPF CPF 约束条件
18 @URL URL 约束条件
18 @Email Email 约束条件
19 @UniqueElements 元素唯一约束条件
20 @Range 指定范围元素约束条件
条件注解
说明
有时候我们需要根据不同的参数,进行不同的限制条件。

比如新建时用户 id 不需要传入,但是修改时 id 必填。

如果是传统的 hibernate-validator 处理就会比较麻烦,此处引入条件注解。

内置注解
序号 注解 说明
1 @EqualsCondition 等于指定值的条件
2 @NotEqualsCondition 不等于指定值的条件
3 @AlwaysTrueCondition 永远生效的条件
4 @AlwaysFalseCondition 永远不生效的条件
使用
使用起来也不难,下面的效果如下:

operType == ‘create’ 时,name 的校验才会生效。
operType != ‘create’ 时,id 的校验才会生效。
其他使用方式保持不变。

public class ConditionUser {

/**
 * 操作类型
 */
@Ranges({"create", "edit"})
private String operType;

/**
 * 新建时,name 必填
 */
@EqualsCondition(value = "create", fieldName = "operType")
@Size(min = 3)
@NotNull
private String name;

/**
 * 不是新建时, id 字段必填
 */
@NotEqualsCondition(value = "create", fieldName = "operType")
@Size(min = 16)
private String id;

//getter & setter

}
过程式接口
说明
日常开发中,我们都很喜欢使用注解对 java bean 进行校验。

但是这回导致我们定义的单个属性校验无法复用。

所以项目中的单个属性校验和注解是一一对应的,为了便于复用。

ValidHelper 方法
ValidHelper 作为统一封装的工具类,提供单个方法校验常见的方法。

和 java bean 类似,方法列表:

序号 方法 返回值 说明
1 failOver(Object object, IConstraint constraint) IResult 全部验证后返回
2 failFast(Object object, IConstraint constraint) IResult 快速验证后返回
3 failOverThrow(Object object, IConstraint constraint) void 全部验证后返回-未通过抛出 ValidRuntimeException 异常
4 failFastThrow(Object object, IConstraint constraint) void 快速验证后返回-未通过抛出 ValidRuntimeException 异常
使用例子
用法和 bean 的类似,只是入参多了第二个约束条件。

IResult result = ValidHelper.failFast(“”, Constraints.notEmptyConstraint());
IConstraint 对应关系
注解和常见的接口方法一一对应,所有的约束方法在 Constraints 工具类中。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2201_75912525/article/details/129678472

java ee互联网轻量级框架整合开发_cici岛的博客-爱代码爱编程

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”)购买正版 封页 编辑推荐

java五大框架有哪些_Java五大框架-爱代码爱编程

2017-6-13Lifusen 此文章仅代表个人观点,如有问题提出请联系Q:570429601 1、Hibernate (开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语

java web 插件式开发框架,vaadin - Web开发框架 - Web开发 - JAVA开源项目 - 开源吧-爱代码爱编程

相关开源项目 Strecks:针对Java 5.0开发人员设计,扩展自Struts的一个Web框架。它的特点包括:POJO action,注释式校验,数据绑定和转换,依赖注入,拦截器等。 Swingweb:Swingweb是一个web框架,它能够在一个Web容器中操作AWT/Swing应用程序并把它作为一个纯HTML/CSS/javascript的

新一代国产 ORM 框架 sagacity-sqltoy-5.1.10 发版,统一授权传参和越权校验-爱代码爱编程

开源地址: github: https://github.com/sagframe/sagacity-sqltoygitee: sagacity-sqltoy: 基于java语言比mybatis更实用的orm框架,支持mysql、oracle、postgresql、sqlserver、db2、dm、mongodb、elasticsearch、tidb、k

Java命令 - 关于jvm性能优化与gc优化相关参数设置-爱代码爱编程

java 工具的介绍 java - 启动java程序 简介 Windows: javaw命令与java相同,除了javaw没有相关的控制台窗口。当您不希望出现命令提示符窗口时,请使用javaw。然而,如果启动失败,javaw启动器将显示一个带有错误信息的对话框。 要启动一个类文件: java [options] mainclass [args..

java虚拟机中参数的使用和具体介绍-爱代码爱编程

命名 java - 启动一个Java应用程序 简介 要启动一个类文件。 java[options] mainclass [args …]。 要启动JAR文件中的主类。 java[options] -jarjarfile [args …] 。 要在一个模块中启动主类。 java[options] -mmodule[/mainclass] [a

Java log框架使用指南-爱代码爱编程

议题如下: 引言Java世界的log框架发展历程什么是绑定实现(bingding)什么是覆盖实现(override)什么是桥接适配(bridge/route)日志jar包之间的冲突Spring-boot为我们做了什么?Reference 引言 眼花缭乱的日志jar包,让我们无从下手 Java世界的log框架发展历程 先来认识一个人Ceki

牛逼,一整套基于Java开发的的区块链系统(附完整源码)-爱代码爱编程

前言 近几年区块链概念越来越火,特别是区块链技术被纳入国家基础设施建设名单后,各大企业也开始招兵买马,对区块链技术进行研究,从各大招聘网站的区块链职位来看,薪资待遇都很不错,月薪30K到80K的都有,这对于我们程序员来说也是一种机遇,说明学习区块链技术刻不容缓。 我个人从2016年就开始在做区块链系统开发的相关工作,最近身边很多朋友都在找我,想让我给他

fastbuilder 一款让人上瘾的新一代开发神器_only丿阿海的博客-爱代码爱编程

这是一款让人上瘾的新一代开发神器,彻底告别Controller、Service、Dao等传统开发方式。 FastBuilder 将不再区别“前端”与“后端”的概念,一个WEB应用就是一个项目,同时包含前端与后端。 在使用FastBuilder之前,你须具备一定的JS基础,因为FastBuilder几乎全部使用ES6语法进行项目开发。 前言

java之struts2框架学习_马小屑的博客-爱代码爱编程

About Struts2 Struts也是一款MVC框架 , Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全新的Struts2框架 其全新的Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心 Struts2=Struts1+WebWork,而WebWo

jvm监控搭建-爱代码爱编程

文章目录 JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafana JVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia

java中 9 种常见的 cms gc 问题分析与解决_java cms gc-爱代码爱编程

目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 2.5 收集器 2.6 常用工具 3. GC 问题判断 3.1 判断 GC 有没有问题? 3.2 判断是不是 GC 引发的问题

java后端开发高频面试题_java 后端高级开发面试题-爱代码爱编程

JVM 说一下垃圾回收机制? Java 语言中一个显著的特点就是引入了垃圾回收机制,在编写程序的时候不再需要考虑内存管理。垃圾回收机制可以有效的防止内存泄露,提高内存的内存率。 垃圾回收器通常是作为一个单独的低级线程运行,不可预知的情况下对堆中已经死亡的或者长时间没有使用的对象进行清理和回收。 回收机制的算法有:标记清除算法、复制算法、标记压缩算法