0

我为 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.是一条正确的消息,被 name 接受error.validation.money.limited。原来我的消息看起来是这样的:

error.validation.money.limited = Incorrect sum value.

我试图从消息名称中删除 {} 大括号 into MoneyLimited#message(),但没有任何变化(更奇怪)。

我指定了我的验证消息包,如本答案中所述:

<annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
</bean>

所以问题是:如何修复消息?

我正在使用Spring Framework 3.2.4.RELEASEHibernate Validator 4.3.1.Final

4

1 回答 1

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

于 2013-08-12T20:38:19.857 回答