gpt4 book ai didi

java - ValidationMessages.properties 文件之间的冲突

转载 作者:行者123 更新时间:2023-11-30 06:29:23 30 4
gpt4 key购买 nike

我过去常常在一个公共(public)库中收集我所有的验证约束。在 jar 的根目录中,我放置了一个 ValidationMessages_it.properties 文件。一切正常,如果我将这个库放入 jsf 2 war 项目中,所有验证消息都会正确显示。但是,如果我也将另一个 ValidationMessages_it.properties 放入 war 工件中,就会出现问题。在这种情况下,显示了一个 {library.message_key} 字符串。

我认为 Bean Validation 在 war 中找到了正确的属性文件,并没有考虑到在库中。我该如何解决?

例子

我有一个包含自定义约束的库 commons.jar。为了为这些约束设置消息,我在这个库的根目录中添加了一个 ValidationMessages_it.properties

commons.jar
|
+ library
| |
| + CustomConstraint.class
|
+ ValidationMessages_it.properties

ValidationMessages_it.properties

library.custom=Questo è l'errore di cui parlavo

自定义约束.java

@Pattern( regexp = "[a-z]", message = "{library.custom}" )
@Constraint( validatedBy = {} )
@Documented
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention( RetentionPolicy.RUNTIME )
public @interface CustomConstraint {
String message() default "C'è un errore";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}

PS: 请注意,消息键位于 @Pattern 注释而不是 message() 上,这可能看起来是一个错误,但否则它永远不会起作用!

之后,我想在我的网络应用程序项目 (jsf/mojarra 2.1) 中使用这个 commons.jar。一切正常。显示的错误信息是“Questo è l'errore di cui parlavo”。

但现在假设我在我的 web 应用程序中定义了新的验证约束,所以我想通过在 WEB-INF/classes 中添加 ValidationMessages_it.properties 来为这些约束提供翻译文件夹。在这种情况下,显示的错误消息是“{library.custom}”

所以我认为 BV(或 jsf?)在 war 中找到了 bundle 而没有考虑到 commons.jar 中的那个。它在 WEB-INF/classes 文件夹中的 ValidationMessages_it.properties 中找不到 key library.custom,因此返回 {library.custom} 字面意思。

例子2

基于 Bean Validation constraints in a shared library ,我的包结构似乎是正确的。我上传了一个简单的网络应用程序来显示问题:

我在 Glassfish 3.1.2、JBoss AS 7.1.1、Geronimo 3.0.0 中测试了 webapp

Glassfish 和 JBoss 具有相同的行为。在 Geronimo 中,它工作得更好一些。

最佳答案

默认情况下,如果多个 JAR/WAR/等。 files 包含一个具有完全相同名称的资源包文件,其中只有一个将用于 validator 消息。这就是这里的问题:commons.jar 和应用程序 WAR 都包含一个名为 ValidationMessages_it.properties 的资源。

2015 年 7 月发布的 Hibernate Validator 5.2 添加了对聚合来自不同 JAR 文件的所有同名资源包的支持。默认情况下禁用此功能,可以在 org.hibernate.validator.resourceloading.PlatformResourceBundleLocator 中配置.

例子:

PlatformResourceBundleLocator resourceBundleLocator =
new PlatformResourceBundleLocator(ResourceBundleMessageInterpolator.USER_VALIDATION_MESSAGES, null, true);

Validator validator = Validation.byProvider(HibernateValidator)
.configure()
.messageInterpolator(new ResourceBundleMessageInterpolator(resourceBundleLocator))
.buildValidatorFactory()
.getValidator();

使用 Java 配置的 Spring 项目的等效代码:

@Bean
public LocalValidatorFactoryBean validator() {
PlatformResourceBundleLocator resourceBundleLocator =
new PlatformResourceBundleLocator(ResourceBundleMessageInterpolator.USER_VALIDATION_MESSAGES, null, true);

LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
factoryBean.setMessageInterpolator(new ResourceBundleMessageInterpolator(resourceBundleLocator));
return factoryBean;
}

关于java - ValidationMessages.properties 文件之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599208/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com