spring 3.0 MVC似乎忽略了messages.properties

new*_*all 5 forms model-view-controller spring-3

Spring 3.0 MVC

首先,我没有找到任何关于messages.properties @ springsource的文档. 我发现有关覆盖错误消息的所有内容都在各种论坛上.如果有人提到了messages.properties的记录,那就太棒了.也许messages.properties不是来自spring而是java规范?

我已经尝试遵循关于绑定之前的JSR-303类型检查的建议 我的目标是用我自己的用户友好错误消息替换一些类型不匹配错误消息

我的情况如下:

模型

public class Test {

    private int numberbomb;

    public int getNumberbomb() {
        return numberbomb;
    }

    public void setNumberbomb(int numberbomb) {
        this.numberbomb = numberbomb;
    }
}
Run Code Online (Sandbox Code Playgroud)

myservlet.xml

<mvc:annotation-driven/>
Run Code Online (Sandbox Code Playgroud)

JSP

<form:form id="test" method="post" modelAttribute="test">

<form:errors path="*"/>

<form:label path="numberbomb">numberbomb</form:label>
<form:input path="numberbomb"/>

</form:form>
Run Code Online (Sandbox Code Playgroud)

类\ messages.properties

typeMismatch=bad value you bad bad person
test.numberbomb=you are driving me crazy with these bad inputs
Run Code Online (Sandbox Code Playgroud)

表格输出

无法将类型为java.lang.String的属性值转换为属性numberbomb所需的int类型; 嵌套异常是org.springframework.core.convert.ConversionFailedException:无法将类型java.lang.String中的值"three"转换为int类型; 嵌套异常是java.lang.NumberFormatException:对于输入字符串:"three"

我的控制器中的BindingResult.toString()

字段'numberbomb'上对象'test'中的字段错误:被拒绝的值[3]; 码[typeMismatch.test.numberbomb,typeMismatch.numberbomb,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [test.numberbomb,numberbomb]; 参数[]; 默认消息[numberbomb]]; 默认消息[无法将类型'java.lang.String'的属性值转换为属性'numberbomb'所需的类型'int'; 嵌套异常是org.springframework.core.convert.ConversionFailedException:无法将值"3"从类型'java.lang.String'转换为'int'类型; 嵌套异常是java.lang.NumberFormatException:对于输入字符串:"three"]

是否以<form:errors>错误的方式显示错误消息显示自定义错误消息?我是否需要在spring配置文件中添加一些内容以告诉它查看messages.properties?Spring似乎忽略了我的messages.properties文件(位于WEB-INF\classes文件夹中)

谢谢你的任何想法!

new*_*all 4

我的一位同事为我指明了正确的方向。我更改了 myservlet.xml 中的 messageSource bean

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="messages" />
    <property name="cacheSeconds" value="1" />
</bean>
Run Code Online (Sandbox Code Playgroud)

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,这都解决了问题。谢谢同事!:)

  • 这个原因可以在文档中找到!- http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/ReloadableResourceBundleMessageSource.html - “..支持通过“cacheSeconds”设置重新加载属性文件,并且通过以编程方式清除属性缓存。由于应用程序服务器通常会缓存从类路径加载的所有文件,因此有必要将资源存储在其他位置(例如,在Web应用程序的“WEB-INF”目录中)。否则文件的更改类路径不会反映在应用程序中。” (2认同)