簡體   English   中英

Hibernate Validator + Spring:關於驗證錯誤的錯誤消息

[英]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.RELEASEHibernate 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM