如何对多个资源包使用 Java Hibernate 验证?
Posted
技术标签:
【中文标题】如何对多个资源包使用 Java Hibernate 验证?【英文标题】:How to use Java Hibernate validation with multiple Resource bundles? 【发布时间】:2021-09-29 19:48:38 【问题描述】:我有一个包含依赖项的 Java 应用程序。依赖项是一个 Java 库,它提供:
javax.validation.Validator
一组可用于验证的注释及其关联的javax.validation.ConstraintValidator
s
属性文件中自己的一组验证错误消息
一些需要验证的领域模型 POJO
应用程序使用库的验证器来验证库的 POJO。到目前为止,一切都很好。但是该应用程序还编写了一个新的 POJO,其中包含库的 POJO 作为字段(嵌套 POJO)。由库的 POJO 组成的应用程序的 POJO 需要验证,因此应用程序在属性文件中也有自己的验证消息。 (在验证一个 Java 对象时,我们可能需要来自库和来自应用程序的验证消息。
private static final ValidatorFactory FACTORY = Validation.byDefaultProvider()
.configure()
.messageInterpolator(new ResourceBundleMessageInterpolator(
new PlatformResourceBundleLocator("MyLibraryValidationMessages")))
.buildValidatorFactory();
如何验证包含引用来自两个不同资源包的消息的注释(及其关联的ConstraintValidators
)的单个 POJO(其中包含嵌套的 POJO)?需要:Validator
,它从两个不同的资源包中获取消息。我不使用 Spring。
我们可能根本不需要使用属性文件中的资源包,因为我们不需要为不同的语言环境进行单独的消息翻译。对于每个错误,我们只需要一条默认消息。如果我们可以将所有消息存储在代码中,是否可以提供一种解决方法?
我尚未尝试但我认为可行的一种解决方法是确保库和应用程序中的资源包名称完全相同,并将所有消息从 sdk 复制/复制到应用程序的资源包,因为如果它们使用相同的名称,应用程序的包将隐藏库的包。但由于错误消息的重复,这是次优的。
我控制依赖和应用的代码。
【问题讨论】:
【参考方案1】:我刚刚找到了应该做这项工作的AggregateResourceBundleLocator
:
private static final ValidatorFactory FACTORY = Validation.byDefaultProvider()
.configure()
.messageInterpolator(new ResourceBundleMessageInterpolator(
new AggregateResourceBundleLocator(
Arrays.asList("MyLibraryValidationMessages", "MyAppValidationMessages"))))
.buildValidatorFactory();
【讨论】:
以上是关于如何对多个资源包使用 Java Hibernate 验证?的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包
Hibernate:org.hibernate.loader.MultipleBagFetchException:不能同时获取多个包