【问题标题】:Invoking multiple properties in the faces-config jsf, I always invokes the resource?在faces-config jsf中调用多个属性,我总是调用资源?
【发布时间】:2015-02-07 23:30:06
【问题描述】:

我管理两个属性 一个用于通用消息,一个用于属于我系统的每个模块,但我遇到的问题是在调用第一个方法时 getMessage() 总是在应该发送消息时调用资源的属性。

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() 方法总是调用 resource 属性,什么时候应该消息:

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

No进入条件,注意到自带的name值是resource

getResource() 方法不同,如果我注意到它运行正常的话。

请我对这个问题发表评论,谢谢。

【问题讨论】:

    标签: java jsf jsf-2.2


    【解决方案1】:

    看起来问题在于您将两种捆绑包都存储在单个地图中。因此,如果首先使用 resources 捆绑包,则将其添加到地图中。键是当前语言环境(例如“en”)。

    然后,如果您尝试检索具有相同语言环境的 messages 包,您实际上会得到 resources 包而不是 messages 包,因为您使用相同的键。

    要解决这个问题,要么使用两个单独的映射,要么在密钥前面加上包标识符,如下所示:

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

    顺便说一句。您使用标准的 Java 包。关于如何使用 faces-config.xml 中定义的包的更多提示可以在这里找到: How can I get a message bundle string from inside a managed bean?

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2013-06-16
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多