Java Bean Validation使用示例详解
作者:EdurtIO 发布时间:2023-07-19 07:05:26
引言
使用标准框架验证Java bean的基础知识 - JSR 380,也称为Bean Validation 2.0。
当然,验证用户输入在大多数应用程序中是一个超常见的要求,Java Bean Validation框架已经成为处理这种逻辑的事实上的标准。
JSR 380
JSR 380是用于bean验证的Java API的规范,是JavaEE和JavaSE的一部分,它使用@NotNull、@Min和@Max等注释确保bean的属性满足特定的标准。
此版本需要Java 8或更高版本,并利用Java 8中添加的新功能(如类型注释),并支持Optional和LocalDate等新类型。
有关规范的完整信息,请继续阅读JSR 380。
依赖性
我们将使用Maven示例来显示所需的依赖项,但当然,可以使用各种方式添加这些jar。
验证API
根据JSR 380规范,validation-api依赖包含标准验证API:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.Final</version>
</dependency>
验证API参考实现
Hibernate Validator是验证API的参考实现。
要使用它,我们必须添加以下依赖项:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.0.2.Final</version>
</dependency>
这里快速说明的是,hibernate-validator完全独立于Hibernate的持久性方面,并且通过将其添加为依赖项,我们不会将这些持久性方面添加到项目中。
表达式语言依赖关系
JSR 380提供对变量插值的支持,允许在违规消息中使用表达式。
要解析这些表达式,我们必须在表达式语言API和该API的实现上添加依赖项。GlassFish提供参考实现:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
如果未添加这些JAR,您将在运行时收到错误消息,如下所示:
HV000183:无法加载'javax.el.ExpressionFactory'。检查您是否在类路径上有EL依赖项,或使用ParameterMessageInterpolator
使用注解验证
我们将在这里使用User bean作为主要示例,并为其添加一些简单的验证:
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;
public class User {
@NotNull(message = "Name cannot be null")
private String name;
@AssertTrue
private boolean working;
@Size(min = 10, max = 200, message
= "About Me must be between 10 and 200 characters")
private String aboutMe;
@Min(value = 18, message = "Age should not be less than 18")
@Max(value = 150, message = "Age should not be greater than 150")
private int age;
@Email(message = "Email should be valid")
private String email;
// standard setters and getters
}
示例中使用的所有注释都是标准的JSR注释:
@NotNull - 验证带注释的属性值不为 null
@AssertTrue - 验证带注释的属性值是否为 true
@Size - 验证带注释的属性值是否具有属性min和max之间的大小; 可以应用于String, Collection, Map和数组属性
@Min - 验证带注释的属性的值是否小于value属性
@Max - 验证带注释的属性的值是否大于value属性
@Email - 验证带注释的属性是否为有效的电子邮件地址
某些注释接受其他属性,但message属性对所有属性都是通用的。这是当相应属性的值未通过验证时通常会呈现的消息。
可以在JSR中找到的一些其他注释是:
@NotEmpty - 验证属性不为null或为空; 可以应用于String, Collection, Map或 Array值
@NotBlank - 只能应用于文本值,并验证该属性不是null或空格
@Positive和@PositiveOrZero - 适用于数值并验证它们是严格正数还是正数,包括0
@Negative和@NegativeOrZero - 适用于数值并验证它们是严格为负数,还是负数,包括0
@Past和@PastOrPresent - 验证日期值是否过去,包括现在; 可以应用于日期类型,包括Java 8中添加的日期类型
@Future和@FutureOrPresent - 验证日期值是否将来包括现在
验证注释也可以应用于集合的元素:
List<@NotBlank String> preferences;
在这种情况下,将验证添加到选项列表中的任何值。
该规范还支持 Java 8中的新Optional类型:
private LocalDate dateOfBirth;
public Optional<@Past LocalDate> getDateOfBirth() {
return Optional.of(dateOfBirth);
}
在这里,验证框架将自动解包LocalDate值并对其进行验证。
程序验证
一些框架 - 例如Spring--只需使用注释就可以通过简单的方法触发验证过程。这主要是为了使我们不必与程序验证API进行交互。
现在让我们进入手动路线并以编程方式设置:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
要验证bean,我们必须首先拥有Validator对象,该对象使用ValidatorFactory构造。
定义Bean
我们现在要设置一个无效用户 - 使用空名称值:
User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);
验证Bean
现在我们有了一个Validator,我们可以通过将它传递给validate方法来验证我们的bean 。任何违反User对象中定义的约束的行为都将作为Set返回。
Set<ConstraintViolation<User>> violations = validator.validate(user);
通过迭代违规,我们可以使用getMessage方法获取所有违规消息。
for (ConstraintViolation<User> violation : violations) {
log.error(violation.getMessage());
}
在我们的示例中(ifNameIsNull_nameValidationFails),该集合将包含一个ConstraintViolation,消息“ Name not not null”。
来源:https://juejin.cn/post/7168669468531359781
猜你喜欢
- jackson反序列化忽略字段JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有
- 介绍大家都知道微信支付的回调链接要求不能跟参数,但又要接收返回的xml数据。我开始使用@RequestBody注解在参数上,希望能获取xml
- 本文实例讲述了Spring实战之使用注解实现声明式事务操作。分享给大家供大家参考,具体如下:一 配置文件<?xml version=&
- 配置宝塔面板javaweb运行环境详解,若出现404nignx错误也可按此教程进行检查1.准备:(解析成功的域名,本地运行完好的项目,宝塔面
- Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较
- JPanel是面板组件,非顶层容器,一个界面只有可以有一个JFrame窗体组件,但可以有多个Jpanel面板,而JPanel上也可以使用Fl
- 前言现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付, * 惯,功能做完之后做
- 就像集成JDBC和其他ORM框架一样,Spring也集成了iBatis。1,配置iBatis客户模板iBatis的核心是com.ibatis
- 使用AS创建ADIL文件时AS会在main文件夹下给我们生成一个aidl文件夹和一个相同包名的包,通常我们会把所有和ADIL相关的类或文件放
- 报错翻译: compileSdkVersion android-24”需要JDK 1.8或更高版本编译。报错现象如下图:原因:st
- CountDownLatch简介CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(
- 前言:什么是JDBCJava 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户
- 本文实例讲述了java实现word文档转pdf并添加水印的方法。分享给大家供大家参考,具体如下:前段时间,项目需要自动生成word文档,用W
- BeanPostProcessor 的接口定义,可以实现提供自己的实例化逻辑,依赖解析逻辑等,也可以以后在Spring容器实例化完毕,配置和
- 1. 什么是单例模式单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的
- 前几天有个客户在系统上写了一段html语句,打开页面就显示一张炒鸡大的图片,影响美观。后来仔细想想,幸亏注入的仅仅是html语句,知道严重性
- 单线程是安全的,因为线程只有一个,不存在多个线程抢夺同一个资源代码例子:public class SingleThread {int num
- 出现问题描述: 1.Could not get a resource from the pool, Connection refused:
- 前言本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及
- 刚开始项目,需要用到mybatis分页,网上看了很多插件,其实实现原理基本都大同小异,但是大部分都只给了代码,注释不全,所以参考了很多篇文章