Jsf 如何移除周围的???在捆绑包中找不到消息时

Jsf 如何移除周围的???在捆绑包中找不到消息时,jsf,resourcebundle,Jsf,Resourcebundle,在JSF2.0中,如果在消息包中找不到消息,则默认情况下,该键被??包围。这是开发过程中非常有用的提示。然而,在我的特殊情况下,我真的希望那些?不存在。我宁愿只渲染密钥 例如,当我这样做的时候 #{msg.hello} 如果键“hello”不存在,则显示页面 你好 但我想把钥匙拿出来 你好 消息包加载在JSF页面中,如下所示: <f:loadBundle basename="resources.text" var="msg" /> 标记似乎没有一个属性来操纵从该捆绑包中检索值

在JSF2.0中,如果在消息包中找不到消息,则默认情况下,该键被
??
包围。这是开发过程中非常有用的提示。然而,在我的特殊情况下,我真的希望那些
不存在。我宁愿只渲染密钥

例如,当我这样做的时候

#{msg.hello}
如果键“hello”不存在,则显示页面

你好

但我想把钥匙拿出来

你好

消息包加载在JSF页面中,如下所示:

<f:loadBundle basename="resources.text" var="msg" />

标记似乎没有一个属性来操纵从该捆绑包中检索值的方式。我是否应该覆盖某个类,或者如何截获从包中检索消息的方式


我发现了一篇关于这方面的非常有趣的文章:。但是,在我的例子中,我只想省略
。我认为这个解决办法相当复杂。我怎样才能实现它呢?

基本名称可以指向一个完整的类。例如

<f:loadBundle basename="resources.Text" var="msg" />

您还可以创建一个简单的bean来处理字符串操作。如果您不需要在任何地方移除默认环境,而只在特定位置移除,则此方法会更好。第二个函数使用起来更安全,因为它还负责翻译以
开头和结尾的情况

@ApplicationScoped
@Named
public class LocaleUtils {

    public String getMessage(String s) {
        return clearMessage(s);
    }

    public Object getMessage(ResourceBundle propertyResourceBundle, String key) {
        try {
            return propertyResourceBundle.getObject(key);
        }
        catch (MissingResourceException e) {
            return clearMessage(key);
        }
    }

    private static String clearMessage(String s) {
        String clearMessage = s;
        String prefix = "???", suffix = "???";

        if (s != null && s.startsWith(prefix) && s.endsWith(suffix)) {
            s = s.substring(prefix.length());
            clearMessage = s.substring(0, s.length() - suffix.length());
        }
        return clearMessage;
    }
}
用法:

<h:outputText value="#{localeUtils.getMessage(msg['hello'])}"/>
<h:outputText value="#{localeUtils.getMessage(msg, 'hello')}"/>


非常感谢您,您的答案非常完美,非常有魅力。哈特利克潮湿!如能对
-1
进行简单解释,将不胜感激。
@ApplicationScoped
@Named
public class LocaleUtils {

    public String getMessage(String s) {
        return clearMessage(s);
    }

    public Object getMessage(ResourceBundle propertyResourceBundle, String key) {
        try {
            return propertyResourceBundle.getObject(key);
        }
        catch (MissingResourceException e) {
            return clearMessage(key);
        }
    }

    private static String clearMessage(String s) {
        String clearMessage = s;
        String prefix = "???", suffix = "???";

        if (s != null && s.startsWith(prefix) && s.endsWith(suffix)) {
            s = s.substring(prefix.length());
            clearMessage = s.substring(0, s.length() - suffix.length());
        }
        return clearMessage;
    }
}
<h:outputText value="#{localeUtils.getMessage(msg['hello'])}"/>
<h:outputText value="#{localeUtils.getMessage(msg, 'hello')}"/>