雅加达命名空间
作为从Oracle 到Eclipse Foundation 的移交的一部分,Java EE 正在重命名为 Jakarta EE。在 Jakarta EE 9 中,Java 包名称从 javax.* 更改为 jakarta.*。
关于雅加达,Answer by M. Justin 是正确的。我添加了这个答案以提供更多解释和具体示例。
接口与实现
Jakarta Bean Validation 是 Java 中的 API 规范。此规范的二进制库仅包含interfaces,不包含可执行代码。所以我们还需要这些接口的实现。
我只知道 Jakarta Bean Validation 版本 2 和 3 规范的一种实现:Hibernate Validator 版本 6 和 7(分别)。
桌面和控制台应用程序
对于 Web 应用,符合 Jakarta 标准的 Web 容器将提供执行 Bean 验证所需的接口和实现。
对于桌面和控制台应用程序,我们没有这种符合 Jakarta 标准的 Web 容器。因此,您必须将接口 jar 和实现 jar 与您的应用程序捆绑在一起。
您可以使用诸如Maven、Gradle 或Ivy 之类的依赖项管理工具来下载和捆绑接口和实现 jar。
雅加达表达语言
要运行 Jakarta Bean 验证,我们还需要另一个 Jakarta 工具:Jakarta Expression Language,special purpose programming language 用于嵌入和评估 expressions。 雅加达表达语言也简称为EL。
Jakarta 表达语言 由 Jakarta EE 定义为您必须下载一个 jar 接口的规范。而且你还需要在另一个jar中获取这些接口的实现。
您可以选择实现。截至 2021 年 3 月,我知道 Eclipse Foundation 的 Eclipse Glassfish 提供了一个实现作为单独的库,我们可以免费下载。可能还有其他实现,例如 IBM Corporation 的 Open Liberty。货比三家,寻找适合您需求的实施方案。
Maven POM 依赖项
将所有这些信息汇总在一起,您需要四个 jar:两个项目中的每一个都有一对接口和实现 jar,Jakarta Bean Validation 和 Jakarta Expression Language。
如果 Maven 是您选择的工具,以下是您需要添加到 Maven POM 文件中的四个依赖项。
如上所述,您也许可以找到另一种 EL 实现来替代我在这里使用的 Glassfish 库。
<!--********| Jakarta Bean Validation |********-->
<!-- Interface -->
<!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Implementation -->
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.1.Final</version>
</dependency>
<!-- Jakarta Expression Language -->
<!-- Interface -->
<!-- https://mvnrepository.com/artifact/jakarta.el/jakarta.el-api -->
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
</dependency>
<!-- Implementation -->
<!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el -->
<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
{
// ---------------| Member fields |----------------------------
@NotNull
private String manufacturer;
@NotNull
@Size ( min = 2, max = 14 )
private String licensePlate;
@Min ( 2 )
private int seatCount;
// ---------------| Constructors |----------------------------
public Car ( String manufacturer , String licensePlate , int seatCount )
{
this.manufacturer = manufacturer;
this.licensePlate = licensePlate;
this.seatCount = seatCount;
}
// ---------------| Object overrides |----------------------------
@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();
// No violations.
{
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() );
}
// 3 violations.
{
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