2010-12-02 84 views
4

我使用Spring 2.5的JSF 1.2,在的Tomcat 6.0.13JSF 1.2 Application.getMessageBundle()返回null

在一个代码部分,我试图通过使用以下方法来加载的ResourceBundle

ResourceBundle.getBundle(context.getApplication().getMessageBundle(), Locale.EN); 

的问题是,getMessageBundle()方法返回。这用于与JSF 1.1一起使用。 有没有人知道可能是什么问题?

现在我要硬编码包的名称,但我宁愿如果我所有的配置数据将被放置在faces-config

资源束被设置如下:<message-bundle>条目的

<application> 
     <locale-config> 
      <default-locale>en</default-locale> 
     </locale-config> 
     <resource-bundle> 
      <base-name>org.mysite.MessageBundle</base-name> 
      <var>msgs</var> 
     </resource-bundle> 
    </application> 

回答

2

getMessageBundle()该返回的值在faces-config.xml,而不是<resource-bundle>条目。

它的值实际上无法通过JSF 1.2 API获得。你必须自己指定它。

ResourceBundle bundle = context.getApplication().getResourceBundle(context, "org.mysite.MessageBundle"); 

<message-bundle>用于验证/转换消息。可能你已经实际上在JSF 1.1中使用了这个。

+0

好吧,不知道这个功能缺少JSF 1.2。非常感谢! – Igor 2010-12-02 12:47:47

+0

它在其他版本中也不存在。我希望它在2.0的某个地方,但也没有。你必须一直困惑资源捆绑(内容)与消息捆绑(面对消息)。 – BalusC 2010-12-02 12:49:11

3

IgorB,

您可以使用资源注入有JSF提供的托管bean与正确的资源包。这将消除对Java源代码中的任何内容进行硬编码的需要,并使该关联很好地集中。

首先在您的支持bean上定义托管属性。在JSF配置中,将托管属性的值设置为引用您的资源包的EL表达式。

我使用Tomcat 6做了类似如下的事情。唯一需要注意的是,您无法从支持bean的构造函数中访问此值,因为JSF尚未初始化它。如果在bean的生命周期中早期需要该值,则在初始化方法上使用@PostConstruct

<managed-bean> 
    ... 
    <managed-property> 
    <property-name>messages</property-name> 
    <property-class>java.util.ResourceBundle</property-class> 
    <value>#{msg}</value> 
    </managed-property> 
    ... 
</managed-bean> 

<application> 
    ... 
    <resource-bundle> 
    <base-name>application_messages</base-name> 
    <var>msg</var> 
    </resource-bundle> 
    ... 
</application>