【问题标题】:Hibernate Validator + Spring: incorrect message on validation errorHibernate Validator + Spring:验证错误消息不正确
【发布时间】: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.RELEASEHibernate 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


【解决方案1】:

我找到了双重解决的原因。我之前没有提到,我使用 Thymeleaf 作为模板引擎(使用 SpringEL)。示例应用程序中有一个有用的 sn-p,我只是复制粘贴(我感到羞耻)并忘记了:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2017-07-28
    • 2013-07-16
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多