在faces-config jsf中调用多个属性,我总是调用资源?

时间:2015-02-07 23:30:07

标签: java jsf jsf-2.2

我管理两个属性是一个用于通用消息,一个用于属于我系统的每个模块,但我遇到的问题是在调用第一个方法 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()方法始终调用资源属性,消息应该何时显示:

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

没有输入条件,并注意到名称值为资源

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

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

1 个答案:

答案 0 :(得分:0)

看起来问题是您将这两种捆绑存储在单个地图中。因此,如果首先使用资源捆绑包,则会将其添加到地图中。关键是当前的语言环境(例如&#34; en&#34;)。

然后,如果您尝试使用相同的区域设置检索消息捆绑包,您实际上会获得资源捆绑而不是消息,因为您使用了同样的关键。

要解决此问题,请使用两个单独的映射或前缀密钥与bundle标识符,如下所示:

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

顺便说一下。您使用标准Java包。有关如何使用faces-config.xml中定义的bundle的更多提示,请访问: How can I get a message bundle string from inside a managed bean?