2010-12-02 46 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>