Java ValidationMessages.properties文件之间存在冲突
我使用收集公共库中的所有验证约束。在jar的根目录中,我放置了一个Java ValidationMessages.properties文件之间存在冲突,java,bean-validation,resourcebundle,Java,Bean Validation,Resourcebundle,我使用收集公共库中的所有验证约束。在jar的根目录中,我放置了一个ValidationMessages\u it.properties文件。 如果我把这个库放到JSF2WAR项目中,所有的验证消息都会正确显示。 然而,如果我在war工件中也放入另一个ValidationMessages\u it.properties,就会出现问题。在这种情况下,将显示{library.message_key}字符串 我认为Bean验证在war中找到了正确的属性文件,而在库中没有考虑到这一点。 我怎样才能解决这个
ValidationMessages\u it.properties
文件。
如果我把这个库放到JSF2WAR项目中,所有的验证消息都会正确显示。
然而,如果我在war工件中也放入另一个ValidationMessages\u it.properties
,就会出现问题。在这种情况下,将显示{library.message_key}
字符串
我认为Bean验证在war中找到了正确的属性文件,而在库中没有考虑到这一点。
我怎样才能解决这个问题
例子
我有一个库commons.jar,它包含自定义约束。为了设置这些约束的消息,我在这个库的根目录中添加了一个ValidationMessages\u it.properties
commons.jar
|
+图书馆
| |
|+CustomConstraint.class
|
+ValidationMessages\u it.properties
ValidationMessages\u it.properties
library.custom=Questoèl'errore di cui parlavo
CustomConstraint.java
@Pattern(regexp=“[a-z]”,message=“{library.custom}”)
@约束(validatedBy={})
@记录
@目标({ElementType.METHOD,ElementType.FIELD})
@保留(RetentionPolicy.RUNTIME)
public@interface自定义约束{
字符串消息()默认为“C'èun error”;
类[]组()默认值{};
类我认为您的解决方案是提到的AggregateResourceBundleLocator。但是,属性文件不能有相同的名称。内部调用ResourceBundle#getBundle,它返回一个ResourceBundle。没有合并/合并同名属性文件的概念
编辑1
关于一种标准的方法,不幸的是没有。Bean Validation 1.1()有一个开放的问题要解决提供约束库的能力,但还没有决定,消息插值也需要解决。也许您对它应该如何工作有一个想法。如果是这样,请向专家组提供建议。默认情况下,如果多个JAR/WAR/etc文件包含一个资源包,请检查beanvalidation.org具有完全相同名称的文件,其中只有一个将用于验证程序消息。这里的问题是:commons.jar
和应用程序WAR都包含名为ValidationMessages\u it.properties
的资源
Hibernate Validator 5.2于2015年7月发布,增加了对聚合不同JAR文件中具有相同名称的所有资源包的支持。默认情况下禁用此功能,可以在中配置
例如:
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;
}
您真正想要实现的是什么?为什么要将捆绑包多次添加到应用程序中?您能否澄清您的配置?您在何处以及如何添加另一个ValidationMessages_it.properties。也许您可以概述war的完整结构,当然还有为什么要添加同一个属性文件两次。如果您愿意的话要能够指定多个不同的属性文件,您应该查看AggregateResourceBundleLocator(如果您使用的是Hibernate Validator)@哈迪:它不是同一个包,它是另一个包含其他消息的包。请参阅我的post@Gunnar,因为您在JSR 349中,例如,您可以看看我的编辑吗?我不知道这是我的配置中的错误、错误还是预期的行为。上载的Web应用程序的FileFactory链接现在无效:无效的下载链接:此文件可能已被删除或已过期。如果文件链接无效,也可能发生此错误。“我有点困惑。是BV迫使我对捆绑包使用相同的名称。我试图做的是一项非常常见的任务,所以我认为EG提供了一种标准的方法来完成它。相反,这里您建议使用hibernate类。我打开了另一个问题,请参阅edit2。非常感谢您的耐心这里没有“标准”做你想做的事情的方法。Bean Validation 1.1()有一个开放的问题要解决提供约束库的能力,但还没有决定,消息插值也需要解决。也许你对它应该如何工作有一个想法。如果是这样,请向专家组提供你的建议。检查beanvalidation.org非常感谢。我认为这是一个bug。如果你更新你的答案我很乐意接受。