![](/img/trans.png)
[英]Flex/Spring/Hibernate validation - spring Validator and ExceptionTranslator
[英]Hibernate Validator + Spring: incorrect message on validation error
我為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()
,但沒有任何變化(甚至更奇怪)。
我按照此答案中的說明指定了驗證消息束:
<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 。
我找到了雙重解決的原因。 我之前沒有提到,我正在使用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}
變量包含在#{}
,它實際上是從包中解析消息。 因此,在驗證約束中使用大括號,可以將消息解析兩次:在注釋級別和視圖模板中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.