Hibernate Validator + Spring:验证错误消息不正确

时间:2013-08-10 18:48:25

标签: spring spring-mvc localization resourcebundle hibernate-validator

我为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

1 个答案:

答案 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的消息。因此,使用验证约束中的大括号,消息被解析了两次:在注释级别和视图模板中。