Jakarta 命名空间
作为从 Oracle 到 Eclipse Foundation 的移交的一部分,Java EE 被重命名为 Jakarta EE。在 Jakarta EE 9 中,Java 包名称已从 javax.*
更改为 jakarta.*
。
M. Justin 的回答 关于 Jakarta 是正确的。我添加了这个回答以提供更多的解释和具体的例子。
接口与实现
Jakarta Bean Validation 是 Java API 的一个规范。该规范的二进制库仅包含接口,没有可执行代码。因此,我们还需要这些接口的实现。
我只知道一个实现Jakarta Bean Validation第2和3版本规范的方法:Hibernate Validator第6和7版本(分别)。
桌面和控制台应用程序
对于Web应用程序,符合Jakarta的Web容器将提供执行Bean验证所需的接口和实现。
对于桌面和控制台应用程序,我们没有这样的符合Jakarta的Web容器。因此,您必须将接口jar和实现jar捆绑到您的应用程序中。
您可以使用依赖管理工具,如Maven, Gradle, 或 Ivy来下载并捆绑接口和实现jars。
Jakarta表达式语言
为了运行
Jakarta Bean Validation,我们还需要另一个Jakarta工具:
Jakarta Expression Language,一种用于嵌入和评估
表达式的
特定目的编程语言。
Jakarta Expression Language也被简称为
EL。
Jakarta Expression Language由Jakarta EE定义为规范,您需要下载接口的jar包,并获取另一个jar包中这些接口的实现。
您可以选择不同的实现。截至2021-03,我知道Eclipse Foundation提供了一个名为
Eclipse Glassfish的实现作为可免费下载的单独库。可能还有其他实现,例如IBM Corporation的
Open Liberty。寻找适合您需求的实现。
Maven POM依赖项
将所有信息汇总起来,您需要四个JAR文件:每个项目都需要一对接口和实现的JAR文件,分别是
Jakarta Bean Validation和
Jakarta Expression Language。
- Jakarta Bean Validation
- Jakarta Expression Language
如果Maven是您选择的工具,则需要添加以下四个依赖项到您的Maven POM文件中。
如上所述,您可能能够找到另一个EL实现来替换我在此处使用的Glassfish库。
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.1.Final</version>
</dependency>
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.1</version>
</dependency>
这应该可以消除javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'
错误。
使用示例
您可以使用以下简单类Car
测试您的设置。我们对三个成员字段进行验证。
package work.basil.example.beanval;
import jakarta.validation.constraints.*;
public class Car
{
@NotNull
private String manufacturer;
@NotNull
@Size ( min = 2, max = 14 )
private String licensePlate;
@Min ( 2 )
private int seatCount;
public Car ( String manufacturer , String licensePlate , int seatCount )
{
this.manufacturer = manufacturer;
this.licensePlate = licensePlate;
this.seatCount = seatCount;
}
@Override
public String toString ( )
{
return "Car{ " +
"manufacturer='" + manufacturer + '\'' +
" | licensePlate='" + licensePlate + '\'' +
" | seatCount=" + seatCount +
" }";
}
}
或者,如果使用Java 16及更高版本,则可以使用更简洁的record
。
package work.basil.example.beanval;
import jakarta.validation.constraints.*;
public record Car (
@NotNull
String manufacturer ,
@NotNull
@Size ( min = 2, max = 14 )
String licensePlate ,
@Min ( 2 )
int seatCount
)
{
}
运行验证。首先,我们使用成功配置的
Car
对象运行。然后,我们实例化第二个
Car
对象,该对象存在故障,违反了每个字段上的一个约束条件。
package work.basil.example.beanval;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import java.util.Set;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.demo();
}
private void demo ( )
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
{
Car car = new Car( "Honda" , "ABC-789" , 4 );
System.out.println( "car = " + car );
Set < ConstraintViolation < Car > > violations = validator.validate( car );
System.out.format( "INFO - Found %d violations.\n" , violations.size() );
}
{
Car car = new Car( null , "X" , 1 );
System.out.println( "car = " + car );
Set < ConstraintViolation < Car > > violations = validator.validate( car );
System.out.format( "INFO - Found %d violations.\n" , violations.size() );
violations.forEach( carConstraintViolation -> System.out.println( carConstraintViolation.getMessage() ) );
}
}
}
运行时。
car = Car{ manufacturer='Honda' | licensePlate='ABC-789' | seatCount=4 }
INFO - Found 0 violations.
car = Car{ manufacturer='null' | licensePlate='X' | seatCount=1 }
INFO - Found 3 violations.
must be greater than or equal to 2
must not be null
size must be between 2 and 14
5.2.4.Final
对我解决了问题。 - fracz5.2.4.Final
,但异常仍然存在。 - Alfonso Nishikawa