首页 文章

NoSuchMessageException - Spring ReloadableResourceBundleMessageSource

提问于
浏览
0

我正在从 ResourceBundleMessageSource 更改为 ReloadableResourceBundleMessageSource .

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

文档:

它遵循不指定文件扩展名或语言代码的基本ResourceBundle规则,但可以引用任何Spring资源位置(而不是仅限于类路径资源) . 使用“classpath:”前缀,仍然可以从类路径加载资源,但在这种情况下,除“-1”(永久缓存)之外的“cacheSeconds”值可能无法可靠地工作 .

以下就是我的......

Folder structure
messages_en_US.properties

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

应用程序 - 调度 - 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:请求处理失败;嵌套异常是org.springframework.context.NoSuchMessageException:在代码'Size.book.ispn'下找不到区域设置'zh_CN'的消息 . 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:在代码'Size.book.ispn'下找不到区域设置'zh_CN'的消息 . org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:159)com.app.controller.spaController.pageSpa(spaController.java:54)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)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.RequestMap pingHandlerAdapter.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 回答

  • 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

  • 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 . 我只是明确地包含了我的属性文件的实际类路径 .

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

相关问题