java 正则表达式_a-z_0-9 validation,掌握Java-Bean Validation

2023-11-15

数据校验虽然简单,但是却是一个繁琐的事。我在无数的代码看到if判断参数,然后错了打日志抛异常,一片一片的这种代码,如果有点重复了,再弄出N个xxUtil来归纳代码。虽然这种做法可以达到效果,但是代码散乱,一个是编写麻烦,一个是不易阅读。

Java业界最喜欢搞规范,所以参数校验作为一个痛点,JSR 303 – Bean Validation规范出现了。

JSR 303 – Bean Validation

是一个数据验证的规范,2009年11月确定最终方案。2009年12月Java EE 6发布,Bean Validation作为一个重要特性被包含其中。Hibernate Validator是 Bean Validation 的参考实现。Hibernate Validator提供了JSR 303规范中所有内置constraint的实现,除此之外还有一些附加的constraint。

constraint就是约束条件,比如不能为空之类的,这些条件被定义,然后就能被复用,而不是每次都在if语句里写。Bean Validation为Bean的验证定义了元数据模型和API,这里的元数据就是constant,元数据默认的形式是注解,还可以使用xml来定义constraint。

引入Bean Validation

javax.validation

validation-api

1.1.0.Final

org.hibernate

hibernate-validator

5.0.2.Final

javax.el

javax.el-api

3.0.0

org.glassfish.web

javax.el

2.2.6

例子

我们先看看Bean Validation怎么用,有个大体的认识。首先声明需要被校验的Java Bean:

public class User{

@NotNull(message = "用户名不能为空")

private String name;

@Min(value = 1, message = "年龄不能小于1")

@Max(value = 200, message = "年龄不能大于200")

private int age;

// 构造函数,getter,setter略

}

在User Bean中我们使用了几个注解来修饰字段,name字段上添加 @NotNull

表示这个字段不能为空,age字段上添加 @Min

和 @Max

注解,表示限制其最大和最小值。这些constraint注解是Bean Validation规范内置的。全部内置的constraint说明见下文。

然后编写入口函数,实例化Bean并进行校验:

public static void main(String[] args){

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

Set validate = validator.validate(new User(null, 0));

for (ConstraintViolation violation : validate) {

System.out.println(violation.getMessage());

}

}

输出:

用户名不能为空

年龄不能小于1

Bean Validation内置constraint

JSR 303内置了常用的constraint,我们可以直接使用。

空检查

@Null

被注释的元素必须为 null (任何类型)

@NotNull

被注释的元素必须不为 null (任何类型)

布尔检查

@AssertTrue

被注释的元素必须为 true (boolean或者Boolean)

@AssertFalse

被注释的元素必须为 false (boolean或者Boolean)

数字检查

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值 (BigDecimal,BigInteger,byte,short,int,long及其包装类)

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值 (CharSequence,BigDecimal,BigInteger,byte,short,int,long及其包装类)

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内 (BigDecimal,BigInteger,byte,short,int,long及其包装类)

字符串(集合)检查

@Size(max, min)

被注释的元素的大小必须在指定的范围内 (CharSequence,Collection,Map,Array)

@Pattern(value)

被注释的元素必须符合指定的正则表达式 (CharSequence)

时间检查

@Past

被注释的元素必须是一个过去的日期 (Date,Calendar)

@Future

被注释的元素必须是一个将来的日期 (Date,Calendar)

Hibernate Validator扩展的constraint

Hibernate除了实现标准的constraint,还实现了一些扩展constraint。

@NotEmpty

被注释的字符串的必须非空

@NotBlank

被注释的字符串的必须非空白

@Range

被注释的元素必须在合适的范围内 (内部使用 @Min

和 @Max

实现)

@Length

被注释的字符串的大小必须在指定的范围内(同 @Size

)

@URL

被注释的字符串必须是合法的URL

@Email

被注释的元素必须是电子邮箱地址

@SafeHtml

被注解的字符串必须是合法的HTML

@CreditCardNumber

被注释的元素必须是合法的信用卡号,使用的是Luhn算法

@ScriptAssert

直接指定脚本进行校验,算是最灵活的了

自定义Constraint

虽然Bean Validation规范提供了内置的constraint,但是对于实际使用来说是根本不够用的,业务的规则千奇百怪,是需要自己自定义constraint的。

定制一个constraint需要两个部分,一个是constraint注解,一个是执行校验逻辑的类。

比如我们想要定制一个UUID格式字符串的constraint,可以这么写:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Constraint(validatedBy = UUIDValidator.class)

public @interface UUID {

Stringmessage()default "UUID不合法";

Class[] groups() default {};

Class[] payload() default {};

}

constraint注解需要使用 @Constraint(validatedBy = UUIDValidator.class)

来指定这个注解是一个Bean Validation注解,并且指定对应的校验规则实现类。

同时,constraint注解必须是 @Retention(RetentionPolicy.RUNTIME)

,因为在运行是需要使用到注解。

然后编写校验规则实现类:

public class UUIDValidatorimplements ConstraintValidator{

public static final Pattern UUID_PATTERN = Pattern.compile("[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}");

@Override

public void initialize(UUID uuid){

}

@Override

public boolean isValid(String object, ConstraintValidatorContext constraintValidatorContext){

if (object == null){

return true;

}

return UUID_PATTERN.matcher(object).matches();

}

}

实现类需要实现 ConstraintValidator

接口,泛型参数 A

指定该类作用于什么constraint注解上, T

指定这个校验规则作用于什么数据类型。

因为一个constraint注解是可以作用于多种数据类型上的,比如 @Size

即可用于String上,也可以用于集合上,如何做到的呢?就是为一个constraint注解实现多个校验规则实现类,并指定不同的 T

参数。

Bean Validation 2.0

上面说的都是Bean Validation 1.0和1.1。这两个分别是在JavaEE6和JavaEE7中的。对应的JSR是JSR 303。

Bean Validation 2.0是JavaEE8的一部分,只支持Java8+。对应的JSR是JSR 380。

Bean Validation的新功能:

支持验证泛型参数,比如 List positiveNumbers

可以更灵活的验证集合中的Bean,比如 Map customersByType

支持 java.util.Optional

支持JavaFX声明的属性

@Past

和 @Futur

支持JSR 310的时间类型

新增内置constraint:@Email, @NotEmpty, @NotBlank, @Positive, @PositiveOrZero, @Negative, @NegativeOrZero, @PastOrPresent and @FutureOrPresent

所有的内置constraint都是repeatable的

ConstraintValidator#initialize()

是default方法,可选实现

引入Bean Validation 2.0:

javax.validation

validation-api

2.0.0.Final

org.hibernate.validator

hibernate-validator

6.0.2.Final

org.hibernate.validator

hibernate-validator-annotation-processor

6.0.2.Final

javax.el

javax.el-api

3.0.0

org.glassfish.web

javax.el

2.2.6

注意:本文来自木杉的博客。本站无法对本文内容的真实性、完整性、及时性、原创性提供任何保证,请您自行验证核实并承担相关的风险与后果!

CoLaBug.com遵循[CC BY-SA 4.0]分享并保持客观立场,本站不承担此类作品侵权行为的直接责任及连带责任。您有版权、意见、投诉等问题,请通过[eMail]联系我们处理,如需商业授权请联系原作者/原网站。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 正则表达式_a-z_0-9 validation,掌握Java-Bean Validation 的相关文章

  • 二十、转置矩阵

    1 定义 假设 交换A的所有行和列后 形成的新矩阵 即为矩阵A的转置矩阵 对一个矩阵进行转置的转置 结果是原矩阵 2 下面为转置矩阵的性质 分析矩阵时 我们主要从加法 乘法 零空间 列空间 秩 行列式等角度进行分析 矩阵又分为原始矩阵 逆矩
  • Uncaught ReferenceError: xxx is not defined 解决办法

    VM11371 1 Uncaught ReferenceError inputSize is not defined at
  • JSP&EL表达式&MVC&三层结构综合案例

    文章目录 JSP 1 JSP 概述 2 JSP 快速入门 2 1 搭建环境 2 2 导入 JSP 依赖 2 3 创建 jsp 页面 2 4 编写代码 2 5 测试 3 JSP 原理 4 JSP 脚本 4 1 JSP 脚本分类 4 2 案例
  • YOLOv7原文翻译

    前言 这个本来是我的毕业论文文献翻译 但是老师给打回来了 原因是网上的重合率太高 所以我又重新找了一篇 大家 文献翻译千万不要找大热门 太痛苦了 但是翻都翻完了所以就扔上来 除了一些名词不知道怎么翻译之外也还好 按理这些名词应该不翻译直接用
  • CentOS7下解决ifconfig command not found的办法

    注 本办法仅限于可联网的机器 即在安装时设置了IP地址和DNS可正常上网 解决办法如下 1 输入ip addr 确认IP地址是否设置正常 设置好如下所示 如果没有获取到IP地址则设置一个即可 2 确认sbin目录是否存在 cd sbin 3
  • Makefile学习(二)

    Makefile 1 ifeq DEBUG true 2 CC gcc g 生成debug版本 才可以生成调试信息 对程序进行调试 3 else 4 CC gcc 5 endif 6 all hello 7 hello lcd o play
  • 使用 Docker Desktop 安装 Centos 系统

    一 前言 由于 Docker 是一个容器 它支持在一个服务器进行多服务部署 并且还能保持服务的独立性 那么 在Docker 上的运用时 我们也是可以 独立部署多个系统来做不同是其他 这样环境独立的情况下 也就不会造成一下不必要的问题 二 使
  • 后端开发通用

    1 前后端开发 项目基于前后端分离的架构进行开发 前后端分离架构总体上包括前端和服务端 通常是多人协作开发 对于后端java工程师 把精力放在设计模式 spring springmvc linux mysql事务隔离与锁机制 mongodb
  • WB_BF项目问题说明以及探究

    我就现在WB BF项目群里面提到的 根据测试脚本运行日志来看 bf运行了约31小时后又开始出现了api调用返回nginx的错误信息 之后 bf客户端也无法打开 问题做一下说明 今天早上我在机器上复现了这一问题 针对于api调用会返回ngin
  • 遗传算法整理

    1 基本概念 使用群体搜索技术 将种群代表一组问题解 通过对当前种群施加选择 交叉和变异等一系列遗传操作来产生新一代种群 并逐步使种群进化到包含近似最优解的状态 2 遗传算法流程 3 标准遗传算法 标准遗传算法又称为经典遗传算法 它的优化变
  • 百度搭台,千家打擂,文心杯创业大赛成投资人新宠?

    百模大战 打响 掀起大模型领域 创业热潮 今年5月31日 百度启动 文心杯 创业大赛 后简称 大赛 不到1个月报名时间 吸引近1000个项目激烈角逐 在知名投资人和AI专家的权威评审和层层筛选后 40个潜力项目闯入 决赛圈 进行最终较量 大
  • Python数据可视化的例子——热力图(heatmap)

    关系型数据的可视化 热力图体现了两个离散变量之间的组合关系 热力图 有时也称之为交叉填充表 该图形最典型的用法就是实现列联表的可视化 即通过图形的方式展现两个离散变量之间的组合关系 读者可以借助于seaborn模块中的heatmap函数 完
  • skopt下载

    在pycharm中直接下载skopt时失败 网上有如下解决办法 在python当前位置执行下载 1 先安装scikit optimize pip install scikit optimize 后直接在pycharm中安装skopt成功 若
  • fastJson注解@JSONField指定字段的顺序

    使 ordinal指定字段的顺序 public class BasePackage JSONField ordinal 1 private int id JSONField ordinal 2 private int direction J
  • mysql数据库管理-FEDERATED存储引擎远程链接MYSQL+ORACLE

    一 FEDERATED存储引擎 01 从5 1 26开始 默认MySQL不启用federated存储引擎 所以需要在my cnf中加入federated选项 02 或是在命令行用 federated选项启动mysqld 1 1 说明 mys
  • ubuntu下修改用户的默认目录

    linux系统下 不同的用户有对应的默认目录设置 这些设置都被保存在配置文件 etc passwd中 由上我们可以看出 对于用户名为JACK的用户 其系统默认目录为 home JACK 那么有时候我们可能在JACK目录下新建了一个目录 co
  • 大模型:如何利用旧的tokenizer训练出一个新的来?

    背景 我们在用chatGPT或者SD的时候 发现如果使用英语写提示词得到的结果比我们使用中文得到的结果要好很多 为什么呢 这其中就有一个叫做tokenizer的东西在作怪 训练一个合适的tokenizer是训练大模型的基础 我们既可以从头开
  • actuator--基础--6.3--端点解析--loggers端点

    actuator 基础 6 3 端点解析 loggers端点 代码位置 https gitee com DanShenGuiZu learnDemo tree master actuator learn actuator01 1 介绍 用于
  • 使用Selenium自动化测试web程序

    Selenium 是目前用的最广泛的Web UI 自动化测试框架 核心功能就是可以在多个浏览器上进行自动化测试 支持多平台 windows linux MAC 支持多浏览器 ie ff safari opera chrome 多语言C ja

随机推荐

  • GB28181设备接入侧如何支持H.265?

    技术背景 一直以来 GB28181 2022之前的规范版本让人诟病的一点 没有明确针对H 265的说明 特别是监控摄像机 H 265已然成为标配 GB T28181 2022规范 终于针对H 265做了明确的说明 让我们来一起解读下规范 基
  • differential privacy 差分隐私入门 (二)

    书接上回 对差分隐私比较感兴趣 看了几篇文章 了解一下大概的思想 现在决定重新看一下 发现有些文章内容不是很懂 干脆就一边翻译一边看了 不懂的地方我会加下划线 如果有人看到了 还请不吝指教 注 文章是Cynthia Dwork的 Di er
  • JavaSE复习:数组

    数组 Array 是多个相同类型数据按一定顺序排列 的集合 并使用一个名字命名 并通过编号的方式 对这些数据进行统一管理 数组的常见概念 数组名 下标 或索引 元素 数组的长度 1 数组本身是引用数据类型 而数组中的元素可以是任何数据类型
  • curl访问https报错:Cert verify failed: BADCERT_NOT_TRUSTED

    这个错跟https blog csdn net lixuande19871015 article details 88788699里面的错误看上去有些不太一样 curl v https www baidu com Cert verify f
  • 神经网络记忆_带记忆的神经网络

    神经网络记忆 深度学习 DEEP LEARNING We always heard that Neural Networks NNs are inspired by biological neural networks This huge
  • 初探TVM--TVM优化resnet50

    测试用TVM编译出的resnet50在CPU上的效果 测试resnet50在CPU上的效果 编译后的resnet50模型 图像预处理 运行编译后的模型 查看输出结果 resnet50自动调优 模型调优 auto tune 编译调优过的模型
  • Java: Observer Patterns

    版权所有 2022 涂聚文有限公司 许可信息查看 描述 观察者模式 Observer Patterns 也叫做发布 订阅模式 Publist Subscribe 模型 视图模式 Model View 源 监听器 Source Listene
  • [毕业设计]最新通信工程专业毕设选题题目推荐汇总

    文章目录 1前言 2 如何选题 3 通信工程选题方向 3 1 移动通信方向 3 2 嵌入式开发方向 3 3 人工智能方向 3 4 物联网方向 3 5 算法研究方向 3 6 移动应用开发方向 3 7 网络通信方向 3 8 学长作品展示 4 最
  • DevOps到底是什么意思?

    提到DevOps这个词 我相信很多人一定不会陌生 作为一个热门的概念 DevOps近年来频频出现在各大技术社区和媒体的文章中 备受行业大咖的追捧 也吸引了很多吃瓜群众的围观 那么 DevOps是什么呢 有人说它是一种方法 也有人说它是一种工
  • 为什么要在测试集中不需要使用fit_transform的原因?

    假设我们有一组数据 10 20 30 则标准化之后的数据为 array 1 22474487 0 1 22474487 这组数据的均值为 20 0 标准差为 8 16496580927726 标准化之后的这组数据 其标准差为1 均值为0 假
  • 张钜楷:1.22黄金原油下周实时行情趋势分析及黄金独家操作建议指导

    黄金行情走势分析 周五 1月21日 国际金价进一步走低 远离隔夜创下的11月22日以来高位1847 87美元 盎司 金价对美国升息很敏感 利率上升会降低持有无孳息黄金的吸引力 但金价周线有望连续第二周收阳 本周到目前为止累计涨幅逾0 8 因
  • sql查找一列中某一数值出现次数大于2的记录

    sql查找一列中某一数值出现次数大于2的记录 百度知道
  • 机械臂控制——4

    Robot Drivers 机器人驱动程序可以控制连接到计算机的真实机器人 机器人驱动程序使用通用软件接口来控制和监视特定的机器人控制器 使计算机能够控制工业机器人 机器人驱动程序提供了脱机编程的替代方案 程序被模拟 生成 然后传输到机器人
  • python人工智能应用实例_90后博士说,从Python到人工智能只差这35个趣味案例,越学越有趣...

    有趣的生活每个人都向往 有趣的Python编程学习方式却不是每个人都体验过 以这35个趣味案例开始 让兴趣成为学习Python最好的动力 看看这35个趣味案例 几乎是每个案例都对应着一个Python的知识点 比如 以照猫画虎的案例 教你剖析
  • mysql中geometry类型的简单使用(搜索附近的人)

    mysql中geometry类型的简单使用 编写本文的目的 让和两天前的我一样的初学者 能够更快的使用geometry类型存储空间点数据 也是为了自己加深印象 更熟练的使用geometry类型 建表脚本 CREATE TABLE z gis
  • 微信小程序云开发教程一

    微信小程序云开发 初学者入门教程一 云开发环境搭建 本教程适合刚刚入门的小白 云开发为开发者提供完整的云端支持 弱化后端和运维概念 无需搭建服务器 使用平台提供的 API 进行核心业务开发 即可实现快速上线和迭代 同时这一能力 同开发者已经
  • Pandas数据分析初学--开始了解数据

    探索Chipotle快餐数据 作为一个Pandas初学者 今天用这道题目练手 分享出来 首先 impotr pandas as pd 1 将数据集存入一个名为chipo的数据框内 iris filename chipotle csv chi
  • SkyWalking链路追踪中Trace概念以及Trace与span的关系

    基本概念 在SkyWalking链路追踪中 Trace 追踪 是指一个请求或者一个操作从开始到结束的完整路径 它涵盖了分布式系统中所有相关组件的调用关系和性能信息 具体来说 Trace包含了一系列的span 跨度 每个span代表了一个组件
  • kibana使用_从kibana迁移到grafana作为elasticsearch的展现

    今天说说 我们为什么会选择从kibana迁移到grafana 并选用grafana作为elasticsearch的图表展现工具 文章中关于kinaba和grafana的对比会有些片面 勿喷 最一开始使用kibana ElasticSearc
  • java 正则表达式_a-z_0-9 validation,掌握Java-Bean Validation

    数据校验虽然简单 但是却是一个繁琐的事 我在无数的代码看到if判断参数 然后错了打日志抛异常 一片一片的这种代码 如果有点重复了 再弄出N个xxUtil来归纳代码 虽然这种做法可以达到效果 但是代码散乱 一个是编写麻烦 一个是不易阅读 Ja