2

我已经尝试过这个映射,但 JSF 就是找不到它。

<application>
    <resource-bundle>
        <base-name>/WEB-INF/i18/messages</base-name>
        <var>msg</var>
    </resource-bundle>
</application>

我见过的所有示例都将 messages.properties 放在 Java Source 文件夹中。有些使用包名,有些则不使用——这仍然很像使用空白包名。JSF 是否强制我们将资源包存储在 Java Source 下?

4

1 回答 1

3

这不是 JSF 特有的。这是特定于ResourceBundleAPI的。捆绑包是通过调用者的类加载器以完全限定的基本名称加载的规范。从javadoc(强调我的):

getBundle

public static final ResourceBundle getBundle(String baseName)

使用指定的基本名称、默认语言环境和调用者的类加载器获取资源包。[...]

参数:

baseName- 资源包的基本名称,完全限定的类名

[...]

在幕后,它ClassLoader#getResourceAsStream()用于获取InputStream类路径资源。

/WEB-INF文件夹不是类路径的一部分。它是网络内容的一部分。Web 内容资源只能通过编程方式获得,ServletContext#getResourceAsStream()并且在 JSF 中固有地通过ExternalContext#getResourceAsStream(). 您当然可以自制一个ResourceBundle.Control将资源加载为 Web 内容资源的自定义,但实际上不建议在没有任何有效技术原因的情况下以不同于标准的方式做事。

只需按照通常的方式将这些资源放在类路径中。将它们放在网络内容中是没有意义的。

于 2013-12-17T08:40:44.190 回答