我为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 。
答案 0 :(得分:0)
我找到了双重解决的原因。我之前没有提到,我正在使用 Thymeleaf 作为模板引擎(使用 SpringEL )。示例应用程序中有一个有用的代码段,我只是复制粘贴(羞辱我)并忘记了:
<div class="errors" th:if="${#fields.hasErrors('*')}" th:fragment="validationErrorTpl">
<ul>
<li th:each="err : ${#fields.errors('*')}" th:text="#{${err}}">Input is incorrect</li>
</ul>
</div>
正如您可以看到${err}
中包含的#{}
变量,它实际上正在解析来自bundle的消息。因此,使用验证约束中的大括号,消息被解析了两次:在注释级别和视图模板中。