MessageSource找不到ResourceBundle [messages],无法找到基本名称为messages的包。

3
在applicationContext.xml文件中,我定义了如下的MessageSource:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>/WEB-INF/i18n/messages</value>
        </list>
    </property>
</bean>

我还需要加载所有本地化的消息,因此我已经为此创建了自己的类:

public class ErpMessageSource extends ResourceBundleMessageSource {

    public Map<String, String> getMessages(String basename, Locale locale) {
        Set<String> keys = getKeys(basename, locale);
        Map<String, String> m = new HashMap<String, String>();

        for (String key : keys) {
            try {
                m.put(key, getMessage(key, null, locale));              
            } catch (Exception e) {
                System.err.println(key + " - " + e.getLocalizedMessage());
            }
        }

        return m;
    }

    private Set<String> getKeys(String basename, Locale locale) {
        ResourceBundle bundle = getResourceBundle(basename, locale);
        return bundle.keySet();
    }

}

我有两个问题:
问题1: 我的消息文件位于WEB-INF/i18n目录下。它只包含2个文件:messages_en.properties和messages_hr.properties。
如果我尝试运行以上代码,我会收到警告:“MessageSource找不到基础名称为'messages'的资源束,区域设置为'some locale'”,随后是NullPointerException异常。
如果我将消息文件移动到WEB-INF/classes文件夹中,则问题消失,但我遇到了第二个问题。
问题2: 如果我在消息位于WEB-INF/classes目录下运行上述代码,即使所有键都正确加载,我仍会收到异常:“在'some locale'区域设置下找不到代码为'some.code'的消息”。
问题是:如何通过保留消息在WEB-INF/i18n文件夹中来避免问题1,并且我需要解决第二个问题,因为我真的不知道发生了什么。
2个回答

11

您可能只需要将资源文件夹添加到项目的类路径中。

请尝试执行以下操作:

在包资源管理器视图中,右键单击项目名称 ---> 属性 ---> Java构建路径 ---> 保留在源选项卡中(默认打开) ---> 单击“文件夹” ---> 您的所有项目文件夹列表都会出现 ---> 选择包含消息属性文件的文件夹

重新构建项目并尝试运行。


我很高兴能够帮助你 :-) - AndreaNobili

1

虽然这个问题已经存在2年了,但我遇到了同样的问题并找到了解决方法。

如果您想将i18n属性文件保存在WebContent文件夹之外的某个位置,则应修改.setting文件夹中的org.eclipse.resources.prefs文件,并按照以下方式进行操作:

eclipse.preferences.version=1
encoding//WebContent/WEB-INF/i18n/property_en.properties=UTF-8
encoding//WebContent/WEB-INF/i18n/property_fr.properties=UTF-8

在bean属性中,像之前一样设置messageSource。但是加上:
<property name="defaultEncoding" value="UTF-8" />

希望它能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接