簡體   English   中英

使用Hibernate Validator進行表單驗證

[英]Form validation using Hibernate Validator

我正在使用Hibernate Validator來驗證表單中的輸入字段。 理想情況下,當該字段出現問題時,我希望在每個字段旁邊顯示錯誤消息。

在注冊表格中,我要求輸入密碼並重復密碼,我想確保它們匹配。 使用這個問題,我能夠實現這一點。 這個問題當然是驗證發生在類級別,這意味着錯誤消息僅在我執行時顯示:

<form:errors path="*" />

我認為這樣會很好,我也會在客戶端進行驗證,我可以在那里進行內聯方法,如果人們已經關閉了JS,那么我有一個組元素來顯示錯誤並不是那么糟糕。 這種方法的問題是我必須能夠說:

'Name' field cannot be empty
'Email' field is invalid

當我用i18n制作這個應用程序時,我無法對“電子郵件”和“名稱”等字段名稱進行硬編碼,因此我的User實體中有以下內容用於驗證( {fieldEmpty}只是一個字符串,表示'不能為空'):

@Email(message = "{register_EmailInvalid}")
@NotBlank(message = "\"{register_EmailField}\" {fieldEmpty}")
private String email;
@NotBlank(message = "\"{register_NameField}\" {fieldEmpty}")
private String name;
@NotBlank(message = "\"{register_FirstNameField}\" {fieldEmpty}")
private String firstName;
@NotBlank(message = "\"{register_PasswordField}\" {fieldEmpty}")
private String password;
@NotBlank(message = "\"{register_PasswordRepeatField}\" {fieldEmpty}")
private String passwordRepeat;

這會根據用戶的語言環境設置為字段名稱選擇正確的值,但這也意味着我必須在常規messages.properties和我的ValidationMessages.properties復制register_EmailFieldregister_NameField ,....

字段名稱目前都在ValidationMessages.properties並且在頁面加載時不會使用它們,因此表單始終將標簽顯示為我的默認語言環境。

在下面的圖片中,您可以看到所有內容都是荷蘭語,除了我的表單標簽。 我應該如何處理這個問題,我是否錯過了更簡單的方法來實現這一目標? 我可以將類級驗證消息鏈接到特定字段嗎?

在此輸入圖像描述

如果我將表單標簽消息放在我的messages_nl.properties ,那么它當然有效,但我不想讓這些消息重復。

您可以將messages包用作Hibernate Validator的資源包,而不是默認的ValidationMessages包。

為此,請使用自定義資源包定位器設置驗證器,如下所示:

Validator validator = Validation.byDefaultProvider()
    .configure()
    .messageInterpolator(
            new ResourceBundleMessageInterpolator(
                    new PlatformResourceBundleLocator( "messages" )
            )
    )
    .buildValidatorFactory()
    .getValidator();

您只需要配置LocalValidationFactoryBean

<mvc:annotation-driven validator="validator" />

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

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>WEB-INF/i18n/messages</value>
            <value>WEB-INF/i18n/application</value>     
            <value>classpath:ValidationMessages</value>
                           ....
        </list>
    </property>
    <property name="fallbackToSystemLocale" value="false"/>
</bean>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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