NoSuchMessageException - Spring ReloadableResourceBundleMessageSource

时间:2017-03-23 04:34:25

标签: spring spring-mvc

我正在从ResourceBundleMessageSource更改为ReloadableResourceBundleMessageSource

我已经更改了app-dispatcher-servlet.xml以反映ReloadableResourceBundleMessageSource的要求。从<value>com.app.properties.windows</value><value>classpath:windows</value>但我得到了NoSuchMEssageException。我怀疑它与我放置属性文件的位置有关,或者我没有正确链接它。

文档:

  

遵循基本的ResourceBundle规则   没有指定文件扩展名或语言代码,但可以参考   任何Spring资源位置(而不是限制为classpath   资源)。使用&#34;类路径:&#34;前缀,资源仍然可以加载   从类路径,但&#34; cacheSeconds&#34; &#34; -1&#34;以外的值(缓存   永远)在这种情况下可能无法可靠地工作。

以下是我所拥有的......

Folder structure messages_en_US.properties

NotBlank.book.name = Enter something don't be lazy

APP-调度-servlet.xml中

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>classpath:messages</value>
            <value>classpath:windows</value>
        </list>
    </property>
    <property name="defaultEncoding" value="UTF-8" />

</bean>

// some i18n and localization bean

堆栈跟踪

  

org.springframework.web.util.NestedServletException:Request   处理失败;嵌套异常是   org.springframework.context.NoSuchMessageException:未找到任何消息   根据代码&#39; Size.book.ispn&#39;对于语言环境&#39; zh_CN&#39;。     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)     javax.servlet.http.HttpServlet.service(HttpServlet.java:622)     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)   根本原因

     

org.springframework.context.NoSuchMessageException:未找到任何消息   根据代码&#39; Size.book.ispn&#39;对于语言环境&#39; zh_CN&#39;。     org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:159)     com.app.controller.spaController.pageSpa(spaController.java:54)     sun.reflect.NativeMethodAccessorImpl.invoke0(原生方法)     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     java.lang.reflect.Method.invoke(Method.java:483)     org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)     org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)     org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832)     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743)     org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961)     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895)     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)     javax.servlet.http.HttpServlet.service(HttpServlet.java:622)     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

执行的代码在控制器

public class someController(){   
@autowired
private MEssageSource messageSource;

public String pageSpa(Model model){
    System.out.println("loading index page");

    //System.out.println(((CustomMessageSource) messageSource).listMessageProperties("book", locale));
    Locale locale = LocaleContextHolder.getLocale();
    System.out.println(messageSource.getMessage("NotBlank.book.name", null, locale));

    return "spa";
}

谢谢

2 个答案:

答案 0 :(得分:1)

对我有用的是以下内容 在WEB-INF

下移动您的消息文件

按以下方式更改配置

<bean id="messageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>WEB-INF/messages</value>
            <value>WEB-INF/windows</value>
        </list>
    </property>
    <property name="defaultEncoding" value="UTF-8" />
    <property name="cacheSeconds">
        <value>1</value>
    </property>
</bean>

我尝试使用文档中指出的类路径前缀,但它不起作用

另请参阅:Reloading of properties file which is loaded using setBundle

答案 1 :(得分:0)

我最终做的是这个

<bean id="messageSource"
    class="com.app.service.CustomMessageSource">
    <property name="basenames">
        <list>
            <value>classpath:com/app/properties/messages</value>
            <value>classpath:com/app/properties/windows</value>
        </list>
    </property>
    <property name="defaultEncoding" value="UTF-8" />

</bean>

由于classpath:包含WEB-INF / class。我只是明确地包含了我的属性文件的实际类路径。

我不确定为什么遵循该文档不起作用。但这对我有用。希望这能帮助其他人度过痛苦的日子。