Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate验证程序+;Spring:验证错误消息不正确_Spring_Spring Mvc_Localization_Resourcebundle_Hibernate Validator - Fatal编程技术网

Hibernate验证程序+;Spring:验证错误消息不正确

Hibernate验证程序+;Spring:验证错误消息不正确,spring,spring-mvc,localization,resourcebundle,hibernate-validator,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.lim

我为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 {};
}
此处的
总和值不正确。
是一条正确的消息,它被name
error.validation.money.limited接受。最初,我的信息看起来是这样的:

error.validation.money.limited = Incorrect sum value.
我试图将{}大括号从消息名中删除到
MoneyLimited#message()
,但没有任何变化(更奇怪)

我指定了验证消息包,如下所述:


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


我使用的是Spring Framework 3.2.4.RELEASE和Hibernate Validator 4.3.1.Final。

我发现了双重解析的原因。我之前没有提到,我使用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的消息。所以,在验证约束中使用大括号,消息被解析了两次:在注释级别和视图模板中。

可以帮助吗?或者你可以设置断点不,它没有帮助,因为它实际上也是这样做的。看看这个答案:(我只是猜测):似乎messageresolver尝试两次解决errormessage:第一次成功,在附加区域设置(或默认区域设置)后,第二次失败(原因是??)(可能是本地化问题),您需要确保使用花括号。他们正在将字符串标记为消息参数。如果没有插值,将不会发生插值。你的全部技术是什么?您也在使用JSF吗?哪个组件会向您返回错误消息?谢谢,Hardy,但我实际上在几个小时前就解决了我的问题。为了得到正确的信息,我应该移除大括号。我知道我写的上面没有帮助。但是当我做这个改变时,我没有重新启动我的应用程序(我正在使用JRebel)。我以为它会自动加载我的更改,但它没有。看起来JRebel不适用于
@inteface
<annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
</bean>
<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>