【问题标题】:Spring MessageSource not being used during validation验证期间未使用 Spring MessageSource
【发布时间】:2012-06-23 02:32:28
【问题描述】:

在我的表单支持对象的 Spring 验证期间,我无法在 messages.properties 中获取我的消息。

app-config.xml:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename" value="messages" />
</bean>

WEB-INF/classes/messages.properties:

NotEmpty=This field should not be empty.

表单支持对象:

...
  @NotEmpty
  @Size(min=6, max=25)
  private String password;
...

当我遍历 BindingResult 中的所有错误并输出 ObjectError 的 toString 时,我得到了这个:

Field error in object 'settingsForm' on field 'password': rejected value []; codes [NotEmpty.settingsForm.password,NotEmpty.password,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [settingsForm.password,password]; arguments []; default message [password]]; default message [may not be empty]

如您所见,默认消息是“可能不为空”,而不是我的消息“此字段不应为空”。

如果我将 messageSource 注入控制器并输出以下内容,我确实会收到正确的消息: messageSource.getMessage("NotEmpty", new Object [] {"password"}, "默认空消息", null);

那么为什么不使用我的messages.properties 进行验证?我正在运行 Spring 3.1.1。谢谢!

【问题讨论】:

  • “Spring Validation”只是一些接口。您是否将 javax.validation 与 Hibernate Validator 一起使用?
  • 我使用@Valid (javax.validation.Valid) 并且在我的表单支持对象中我使用@NotEmpty (org.hibernate.validator.constraints.NotEmpty) 之类的验证。是这个意思吗?

标签: java spring hibernate validation spring-mvc


【解决方案1】:

当您想使用 JSR 303 验证为任何字段设置自定义消息时,您需要在属性文件中的消息键中指定 bean 名称(LoginForm)和字段名称(密码)。格式为 CONSTRAINT_NAME.COMMAND_NAME.FIELD_NAME

NotEmpty.loginform.password=This field should not be empty.

【讨论】:

    【解决方案2】:

    默认情况下,HibernateValidator 将从/WEB-INF/classes/ValidationMessages.properties 获取其所有消息,它直接自己读取此文件,而不是通过 Spring MessageSource。

    如果您想要来自 Spring Message 源的翻译,请在 LocalValidatorFactoryBean 上设置一个。这确实需要您在调度程序 servlet 中手动设置验证 bean,而不是依赖于 mvc:annotation-driven。

    【讨论】:

    • 您还可以使用 '' 将自定义验证 bean 注册为默认值
    【解决方案3】:

    @NotEmpty 有一个可以设置的消息属性。由于您没有设置它,因此它使用默认消息。

    @NotEmpty(message="{NotEmpty}")
    

    应该给你你正在寻找的东西。

    【讨论】:

    • 是的,如果我为它使用的每个 @NotEmpty 设置消息。但我希望它使用我的 messages.properties 来获取 NotEmpty 的默认消息,因此我不必为每个 NotEmpty 设置它。
    • 我从没见过你在春天说什么。验证是字段绑定的,应该这样处理。如果您对具有相同问题的所有字段使用默认消息,则会降低反馈的价值。空密码与空用户名不同,并且给出诸如“您有一个空字段”之类的通用响应确实没有任何价值。
    • 我知道 spring 使用了我的 messages.properties 文件,方法是使用 LocalValidatorFactoryBean 并向我的 mvc:annotation-driven 标记添加验证器。你是对的,我不想对所有字段都有一个通用的 NotEmpty 消息。并且将该消息属性添加到 NotEmpty 确实有效,但我希望它会在我的 messages.properties 中获取我的 NotEmpty.password 消息,而无需明确告诉它使用 NotEmpty.password。
    • 目前还没有这样的约定。该系统本身的设计非常灵活。如果你想要这个功能,你可以自己添加。
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多