使用Hibernate Validator进行表单验证

时间:2013-05-27 08:59:33

标签: java spring jsp internationalization hibernate-validator

我正在使用Hibernate Validator来验证表单中的输入字段。理想情况下,当该字段出现问题时,我希望在每个字段旁边显示错误消息。

在注册表格中我要求输入密码并重复密码,我想确保它们匹配。使用this question我能够实现这一点。这个问题当然是验证发生在类级别,这意味着错误消息只在我这样做时显示:

<form:errors path="*" />

我认为这样会很好,我也会在客户端进行验证,我可以在那里进行内联方法,如果人们已经关闭了JS,那么我有一个组元素来显示它并不是那么糟糕错误。这种方法的问题在于我必须能够说:例如:

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

在我使用i18n制作此应用程序时,我无法对“电子邮件”和“名称”等字段名称进行硬编码,因此我在User实体中有以下内容进行验证({{1只是一个表示'不能为空'的字符串):

{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; register_EmailField中复制... { 1}}和我的register_NameField

字段名称目前都在messages.properties中,并且在页面加载时它们没有被使用,因此表单始终将标签显示为我的默认语言环境。

在下面的图片中,您可以看到所有内容都是荷兰语,但我的表单标签除外。我应该如何处理这个问题,我是否错过了更简单的方法来实现这一目标?我可以将类级验证消息链接到特定字段吗?

enter image description here

如果我将表单标签消息放在我的ValidationMessages.properties中,那么它当然有效,但我不想让这些消息重复。

2 个答案:

答案 0 :(得分:1)

您可以将messages捆绑包用作Hibernate Validator的资源包,而不是默认的ValidationMessages捆绑包。

为此,请使用以下自定义resource bundle locator设置验证程序:

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

答案 1 :(得分:1)

您只需配置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>