【问题标题】:Caused by: org.springframework.context.NoSuchMessageException: No message found under code引起:org.springframework.context.NoSuchMessageException:代码下找不到消息
【发布时间】:2012-06-22 12:04:27
【问题描述】:

正在尝试让 Spring 国际化工作。我使用了 classpath:messages basename,为语言创建了 .properties 文件。它们被正确复制到 web-inf 文件夹,并且代码存在于属性文件中......

这是显示所有内容的 ide,请帮助我。我已经从另一个我已经完成的项目中复制了设置,效果很好。我尝试创建大量不同的消息文件,但它没有提取任何内容...图片显示 web.xml、spring-servlet.xml 和目录结构。

编辑 如果我将 bean 定义添加到 applicationContext 而不是 spring-servlet 它可以工作.. ?

【问题讨论】:

    标签: spring internationalization


    【解决方案1】:

    我去试试:

    如果文件位于WEB-INF/classes 目录下,请尝试:

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="WEB-INF/classes/messages" />
    </bean>
    

    并且文件的名称应该是:

    • messages.properties
    • messages_en.properties
    • messages_en_GB.properties

    编辑 - 最终尝试!

    这种写配置的方式怎么样,在你上次评论后我在这里闻到了味道:

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
        <property name="defaultLocale" value="en" />
    </bean>
    
    <mvc:interceptors>
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptors>
    

    【讨论】:

    • 已经尝试过了,但会再试一次。是的,尝试了那些属性文件(在屏幕截图中),即使 messages_en.properties 在我的其他项目中工作。
    • 尝试在您的目录中只保留其中一个?
    • 我已经看这个太久了。它会变得如此小而烦人
    • 等等有什么问题?
    【解决方案2】:

    将您的消息属性文件保存在类路径(WEB-INF/classes)之外并如下定义 bean

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/messages"/>
    <property name="cacheSeconds" value="1"/>
    

    根据文档 ReloadableResourceBundleMessageSource 为您提供了即时更改 spring 通过 cachSeconds 获取的消息的好处。此类与 ResourceBundleMessageSource 的区别仅在于指定资源位置。

    【讨论】:

    • 是的,这就是为什么您需要将属性文件保留在类路径之外的原因。\
    • 我不认为这是正确的。我的其他项目和这里的其他回复都可以正常工作。但我会尝试,如果正确,我将永远感激不尽
    【解决方案3】:

    所有的配置细节都是正确的,但是做一件事,在子配置文件中配置属性文件,这意味着你的 spring-servlet.xml 将所有属性配置到 applicationContext.xml 这意味着父配置文件最大可以工作。试试看,去掉spring-servlet.xml中属性细节的配置............

    【讨论】:

      【解决方案4】:

      尽管对许多人来说这听起来很愚蠢,但我的代码所犯的错误是我们编写了自己的 MessageSource。这是调用 Spring 的 MessageSource。

      但在代码中它就像 (MessageSource(MessageSource))。因此,我们正在查找而不是查找。

      删除了额外的调用,它现在可以工作了。

      【讨论】:

        猜你喜欢
        • 2017-11-11
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        相关资源
        最近更新 更多