【问题标题】:JSF EL: Fallback if l18n-Propperty not foundJSF EL:如果找不到 l18n 属性,则回退
【发布时间】:2012-07-21 21:33:56
【问题描述】:

在我的 JSF 项目中,我有这样的东西

<h:outputText value="#{msg[foo]}" />

其中 msg 是我的 ResourceBundle,foo 是属性标识符的变量,例如包含 label.car,因此代码将返回 carAuto(国际化)。

问题:

如果 foo 设置为 ResourceBundle 中不存在的属性标识符,比如说 boat,那么应用程序当然会崩溃并显示 javax.el.PropertyNotFoundException .

在 Spring 中,有一种方法可以使用默认消息将其作为后备来处理..

<spring:message code="${foo}" text="${foo}" />

(返回标识符本身而不是它的国际化值)

..我在 JSF 中无法做到这一点。

任何提示在 JSF 中如何实现类似的事情?谢谢!

//更新: - Apache Tomcat/6.0.29 - Apache MyFaces-2 - PrimeFaces 3.3 - tomcat-maven-plugin:1.1 - Java 版本号:1.7.0_05 - Hibernate 3.5.6-Final

【问题讨论】:

  • try "#{msg.fooNew}" 这应该给你 %%fooNew%% ,这就是你要找的?
  • @Daniel:我不这么认为。我想要 foo 的内容只是没有像 foo 的内容那样命名的属性。顺便说一句:通过 getter(。而不是 [])调用属性将不起作用,因为 ressourcePropperties 没有 getter ..)
  • 确定有 getter ,这里有一个在线参考 ... mkyong.com/jsf2/jsf-2-0-and-resource-bundles-example 查找示例 1
  • 啊,好吧,是的。但我在'For a key that has a dot'。作为名称的案例... ;)
  • 您能否发布堆栈跟踪并提及使用的确切 JSF impl/version?这种行为很奇怪,它应该打印???foo???

标签: java jsf web-applications jsf-2 el


【解决方案1】:

我通过 adding my own tag 模仿 Spring 行为“解决”了这个问题:

(我的 TagHandler 实现的摘录)

value = getAttribute("value").getValue(context);
...
key = getAttribute("key").getValue(context);
...
if (key != null) {
  try {
    w.write(String.format("%s", getLocalizedString(key, bundle)));
  } catch (final Exception cause) {
    if (value != null) {
      w.write(String.format("%s", value));
    } else {
      // exception / invalid key
    }
  }

} else if (value != null) {
  w.write(String.format("%s", value));
} else {
  // exception / do noting
}

所以我可以这样使用:

<my:outputText key="#{key}" value="#{fallback_value}" />

【讨论】: