2015-02-07 29 views
0

我管理兩個屬性是一個用於通用消息和一個屬於我的系統的每個模塊,但我遇到的問題是,當調用第一個方法getMessage()總是調用資源的屬性,當它應該去消息。在faces-config jsf中調用多個屬性,我總是調用資源?

public class ResourceBundleUtil implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public static final String MESSAGE_PATH = "messages"; 
    public static final String RESOURCE_PATH = "resources"; 
    private static HashMap<String, Object> messageBundles = new HashMap<String, Object>(); 

    public static String getMessage(String key) { 
     if (key == null) { 
      return null; 
     } 
     try { 
      Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale(); 
      if (locale == null) { 
       locale = Locale.ENGLISH; 
      } 
      ResourceBundle messages = (ResourceBundle) messageBundles.get(locale.toString()); 
      if (messages == null) { 
       messages = ResourceBundle.getBundle(MESSAGE_PATH, locale); 
       messageBundles.put(locale.toString(), messages); 
      } 
      return messages.getString(key); 
     } catch (Exception e) { 
      return key; 
     } 
    } 

    public static String getResource(String key) { 
     if (key == null) { 
      return null; 
     } 
     try { 
      Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale(); 
      if (locale == null) { 
       locale = Locale.ENGLISH; 
      } 
      ResourceBundle messages = (ResourceBundle) messageBundles.get(locale.toString()); 
      if (messages == null) { 
       messages = ResourceBundle.getBundle(RESOURCE_PATH, locale); 
       messageBundles.put(locale.toString(), messages); 
      } 
      return messages.getString(key); 
     } catch (Exception e) { 
      return key; 
     } 
    } 

} 

我的問題是,的getMessage()方法總是調用資源 propertie,應該在什麼時候消息:

if (messages == null) { 
     messages = ResourceBundle.getBundle(MESSAGE_PATH, locale); 
     messageBundles.put(locale.toString(), messages); 
} 

沒有進入條件,並注意到自帶名稱值是資源

不像方法getResource()如果我注意到,運行正常。

請問我應該對此問題發表評論,謝謝。

回答

0

看起來問題是,您將兩種捆綁包都存儲在單個映射中。因此,如果首先使用資源捆綁包,則會將其添加到映射中。關鍵是當前的語言環境(例如「en」)。

然後,如果你嘗試檢索消息包具有相同的區域,你實際上得到資源束代替消息之一,因爲你使用相同的密鑰。

爲了解決此問題,或者使用兩個單獨的地圖或預先準備鍵與這樣軟件包標識符:

messageBundles.put("resources_" + locale.toString(), messages); 

順便說一句。你使用標準的Java捆綁軟件。關於如何使用faces-config.xml中定義的bundle的更多提示可以在這裏找到: How can I get a message bundle string from inside a managed bean?

相關問題