0

我正在使用 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;

register_EmailField这会根据用户的语言环境设置为字段名称选择正确的值,但这也意味着我必须register_NameField在我的常规messages.properties和我的ValidationMessages.properties.

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

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

在此处输入图像描述

如果我将表单标签消息也放入其中,messages_nl.properties那么它当然可以工作,但我不想重复这些消息。

4

2 回答 2

1

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

为此,请使用自定义资源包定位器设置您的验证器,如下所示:

Validator validator = Validation.byDefaultProvider()
    .configure()
    .messageInterpolator(
            new ResourceBundleMessageInterpolator(
                    new PlatformResourceBundleLocator( "messages" )
            )
    )
    .buildValidatorFactory()
    .getValidator();
于 2013-05-27T10:20:07.657 回答
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>
于 2013-05-27T11:02:41.520 回答