【发布时间】:2013-08-12 11:33:54
【问题描述】:
我为 Money 类编写了一个自定义的 Hibernate 验证约束:
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = MoneyLimitedValidator.class)
@Documented
public @interface MoneyLimited {
String message() default "{error.validation.money.limited}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
除了错误消息外,它工作正常。我看到非常奇怪的行为:找到资源包并按名称解析消息,但它包装成特殊字符,如果消息无法按名称解析,通常会出现:
??Incorrect sum value._en_EN??
这里Incorrect sum value. 是一个正确的消息,它被名称error.validation.money.limited 接受。原来我的消息是这样的:
error.validation.money.limited = Incorrect sum value.
我尝试将消息名称中的 {} 大括号删除为 MoneyLimited#message(),但没有任何变化(更奇怪的是)。
我按照in this answer 的描述指定了我的验证消息包:
<annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
所以问题是:如何修复消息?
我正在使用 Spring Framework 3.2.4.RELEASE 和 Hibernate Validator 4.3.1.Final。
【问题讨论】:
-
stackoverflow.com/questions/5550065/… 可以帮忙吗?或者你可以放断点here
-
不,它没有帮助,因为它实际上是一样的。看看这个答案:stackoverflow.com/questions/11225023/…
-
(我只是在猜测):似乎 messageresolver 尝试两次解析错误消息:第一次成功,在附加语言环境(或默认语言环境)和不成功(原因??)(可能是本地化问题)
-
你肯定需要花括号。他们将字符串标记为消息参数。没有插值将发生。您的完整技术堆栈是什么?你也在使用 JSF 吗?哪个组件会返回错误消息?
-
谢谢,哈代,但实际上我几个小时前就解决了我的问题。为了得到正确的信息,我应该去掉大括号。我知道我写的上面没有帮助。但是当我进行此更改时,我没有重新启动我的应用程序(我正在使用 JRebel)。我以为它会自动加载我的更改,但事实并非如此。看起来 JRebel 不适用于
@inteface。
标签: spring spring-mvc localization resourcebundle hibernate-validator