我正在使用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
中,并且在页面加载时它们没有被使用,因此表单始终将标签显示为我的默认语言环境。
在下面的图片中,您可以看到所有内容都是荷兰语,但我的表单标签除外。我应该如何处理这个问题,我是否错过了更简单的方法来实现这一目标?我可以将类级验证消息链接到特定字段吗?
如果我将表单标签消息放在我的ValidationMessages.properties
中,那么它当然有效,但我不想让这些消息重复。
答案 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>