Jakarta Validation
Java Bean Validation 被广泛认为是将验证逻辑集成到 Java 应用程序中的标准。它通过允许开发人员使用声明性验证约束注解域模型属性,采用统一的验证方法。这些约束在运行时强制执行,并提供内置和自定义规则的选项。
webforJ 通过 JakartaValidator 适配器集成了 Bean Validation,提供开箱即用的全面支持。
安装
需要在类路径中包含一个兼容的实现,例如 Hibernate Validator。如果您的环境默认没有此实现,您可以通过以下 Maven 依赖手动添加:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish.expressly</groupId>
<artifactId>expressly</artifactId>
<version>5.0.0</version>
</dependency>
JakartaValidator
JakartaValidator 类作为适配器,桥接了 webforJ 绑定上下文和 Jakarta Validation。这种集成使得可以通过 bean 类中的注解直接使用复杂的验证规则。
激活 JakartaValidator
要在整个上下文中激活 JakartaValidator,通常在构造 BindingContext 时使用 useJakartaValidator 参数。
BindingContext<User> context = new BindingContext<>(User.class, true);
为 bean 属性定义约束
基于注解的约束直接应用于 bean 类,以指定验证条件,如下面的示例所示:
public class Hero {
@NotEmpty(message = "姓名不能为空")
@Length(min = 3, max = 20)
private String name;
@NotEmpty(message = "未指定能力")
@Pattern(regexp = "Fly|Invisible|LaserVision|Speed|Teleportation", message = "无效的能力")
private String power;
// getters and setters
}
这样的约束与在绑定初始化期间以编程方式设置的约束效果相同,并产生一致的验证结果。
当前,JakartaValidator 仅识别直接分配给属性的约束,并忽略任何未直接与属性关联的验证。
语言环境感知的验证消息 25.12
Jakarta Validation 通过标准消息插值支持本地化约束消息。当您更改应用程序的语言环境时,JakartaValidator 需要知道新的语言环境,以便可以以正确的语言解析消息。
JakartaValidator 实现了 LocaleAware 接口,这意味着 BindingContext.setLocale() 会自动将语言环境传播到上下文中的所有 Jakarta 验证器。您无需手动更新每个验证器。
BindingContext<Hero> context = new BindingContext<>(Hero.class, true);
// 当语言环境更改时,Jakarta 验证器会自动
// 以新的语言环境生成消息
context.setLocale(Locale.GERMAN);
在实现 LocaleObserver 的组件中,在 onLocaleChange() 中调用 context.setLocale() 以保持验证消息与 UI 语言同步:
@Override
public void onLocaleChange(LocaleEvent event) {
context.setLocale(event.getLocale());
}
关于语言环境感知的验证器,请参见 动态验证消息。