1

我正在尝试在资源文件中定义错误消息,但似乎无法加载它们,因此我可以在控制器中使用它们。

我的servlet-context.xml文件:

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

我的表格

public class LoginForm {
    @NotEmpty
    private String username;
    // getters and setters
}

我的messages.properties文件(在我的源文件夹的根目录中,所以它被编译到我的类文件夹的根目录):

NotEmpty.loginForm.username=test1
NotEmpty.username=test2
NotEmpty.java.lang.String=test3
NotEmpty=test4

我的控制器

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@Valid LoginForm form, BindingResult result) {
    if (result.getFieldErrors().size() > 0) {
        FieldError firstError = result.getFieldErrors().get(0);
        System.out.println(firstError.getDefaultMessage());
    }
    // ...
}

但是,getDefaultMessage调用的输出绝不是我在资源文件中定义的!它始终是may not be empty(默认值)。

我在我的上下文文件中尝试了各种不同的条目,但它似乎没有加载资源文件。我究竟做错了什么?

4

4 回答 4

1

根据此文档,您只需将一个名为的属性文件ValidationMessages.properties放在项目类路径的根目录下。

然后,您可以使用以下格式添加属性

org.hibernate.validator.constraints.NotEmpty.message=Default message, can not be empty 
NotEmpty.ClassName.fieldName=fieldName can not be empty.

whereClassName是您的班级的名称,并且fieldName是该班级的字段的名称。

您可能需要进行一些配置来设置正确的MessageInterpolator,但我认为默认配置会满足您的需求。

于 2013-08-20T16:08:12.097 回答
0

第一个想法:

尝试将属性键从 NotEmpty.loginForm.username 重命名为 NotEmpty(只是为了检查 messageSource 是否正常工作)。如果仍然不工作有

第二个想法:

您在哪里执行组件扫描?假设您有两个 spring 配置:applicationContext.xml(或其他名称)和 servlet-context.xml。

如果您<context:component-scan base-package="by.company.app" />在 applicationContext 中有这样的结构,那么您的控制器没有定义 messageSource - 因此它无法加载自定义消息。这是因为 @Controller bean 在一个 spring 上下文中,MessageSource bean 在另一个。(要检查这一点,您可以简单@Autowired MessageSource messageSource地在控制器中声明字段并在调试中查看它是否为空)在这种情况下,您可以将 applicationContext 中的组件扫描修改为:

<context:component-scan base-package="by.company.app">
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

并将以下配置添加到 servlet-context.xml:

<context:component-scan base-package="by" use-default-filters="false">
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

希望这可以帮助

于 2013-08-20T21:40:48.460 回答
0

不幸的是,看起来必须定义 MessageSource,然后在适当的 Java 类中使用。该getDefaultMessage()方法似乎无法从消息属性中读取。

在组件扫描类中:

@Autowired
private MessageSource messageSource;
public String getMessage(FieldError field) {
    return messageSource.getMessage(field, null);
}

这将遍历消息属性文件中的所有可能性,然后——如果没有找到——返回getDefaultMessage()结果。

此外,我更新了我的 servlet-context.xml 文件以使用 basename 值定义我的 messageSource,这与/WEB-INF/classes/messages我在上面的问题中的内容相反。

于 2013-09-09T16:42:59.017 回答
0

我花了一些时间来解决这个问题,我做了以下更改,现在它在 Spring 4.0 MVC 和 Hibernate 4.1.9 中运行良好

1.将消息放在源文件夹下。

  1. 如果 ReloadableResourceBundleMessageSource 不工作更改为

    class="org.springframework.context.support.ResourceBundleMessageSource">

  2. 更改属性,例如 '<'property name="basename" value="messages"/>

  3. 在 Message.properties 文件中,密钥应采用以下格式。

    NotEmpty.userForm.userId

    userForm-->Model class name.
    

(如果您的模型类名称是 UserForm,那么它应该
被称为 userForm)

    userId--> attribute of userForm class
于 2014-07-12T08:14:26.857 回答