我习惯将所有验证约束收集在一个公共库中。在罐子的根部我放了一个ValidationMessages_it.properties
文件。
一切正常,如果我将此库放入 jsf 2 war 项目中,所有验证消息都会正确显示。
但是,如果我再放一个,就会出现问题ValidationMessages_it.properties
战争神器中也是如此。在这种情况下{library.message_key}
显示字符串。
我认为 Bean Validation 在战争中找到了正确的属性文件,并且没有考虑到库中的属性文件。
我该如何解决?
Example
我有一个库 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() 上,这可能看起来是一个错误,但否则它永远不会起作用!
之后我想用这个commons.jar
在我的网络应用程序项目(jsf/mojarra 2.1)中。一切正常。显示的错误消息是“Questo è l'errore di cui parlavo”。
但现在假设我在 web 应用程序中定义了新的验证约束,因此我想通过添加ValidationMessages_it.properties
in WEB-INF/classes
文件夹。在这种情况下,显示的错误消息是“{library.custom}”
所以我认为 BV(或 jsf?)在战争中找到了捆绑包,并且没有考虑到 commons.jar 中的捆绑包。它没有找到钥匙library.custom
in the ValidationMessages_it.properties
位于WEB-INF/classes
文件夹从而返回{library.custom}
字面上地。
实施例2
基于共享库中的 Bean 验证约束 https://stackoverflow.com/questions/11683708/bean-validation-constraints-in-a-shared-library,我的包结构似乎是正确的。我上传了一个简单的网络应用程序来显示问题:
- 可以部署在符合 java EE 6 的应用程序服务器中的战争工件 http://www.filefactory.com/file/1v4e61w0ty77/n/bvtest-1_0_war
- 包含两个 Maven 项目的源 zip,一个用于库,一个用于 Web 应用程序 http://www.filefactory.com/file/1iteiatld9of/n/bvsource_zip
我在 Glassfish 3.1.2、JBoss AS 7.1.1、Geronimo 3.0.0 中测试了 web 应用程序
Glassfish 和 JBoss 具有相同的行为。在 Geronimo 中,它的效果要好一些。