如何删除周围??? 在捆绑中找不到邮件时

ros*_*ose 8 jsf resourcebundle

在JSF 2.0中,如果在消息包中找不到消息,则默认情况下,该键被包围???.这是开发过程中非常有用的提示.但是,就我而言,我真的希望那些???不存在.我更喜欢只渲染密钥.

比如我这样做

#{msg.hello}
Run Code Online (Sandbox Code Playgroud)

并且键'hello'不存在,然后页面显示

???你好???

但我想展示一把钥匙

你好

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

<f:loadBundle basename="resources.text" var="msg" />
Run Code Online (Sandbox Code Playgroud)

<f:loadBundle>标记似乎没有一个属性来操纵从该包中检索值的方式.我应该覆盖某个类或如何拦截从捆绑中检索消息的方式?

我发现了一篇非常有趣的文章:JavaServer Faces应用程序中的Context Sensitive Resource Bundle条目 - 超越了普通语言,区域和变体语言环境.但是,就我而言,我只想省略???.我认为这个解决方案相当复杂.我怎么能实现呢?

Bal*_*usC 9

basename可以指向fullworthy ResourceBundle类.例如

<f:loadBundle basename="resources.Text" var="msg" />
Run Code Online (Sandbox Code Playgroud)

package resources;

public class Text extends ResourceBundle {

    public Text() {
        setParent(getBundle("resources.text", FacesContext.getCurrentInstance().getViewRoot().getLocale()));
    }

    @Override
    public Enumeration<String> getKeys() {
        return parent.getKeys();
    }

    @Override
    protected Object handleGetObject(String key) {
        return parent.getObject(key);
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以覆盖中的捆绑邮件处理handleGetObject.JSF默认情况下(按规范)调用getObject(),捕获MissingResourceException"???" + key + "???"在捕获时返回.你可以采用不同的方式.

@Override
protected Object handleGetObject(String key) {
    try {
        return parent.getObject(key);
    } catch (MissingResourceException e) {
        return key;
    }
}
Run Code Online (Sandbox Code Playgroud)