2

我目前有以下JSF:

<p:outputLabel value="#{msg['label.address.province']}" 
               rendered="#{address.country ne CountryEnum.UNITED_STATES.country}"/>
<p:outputLabel value="#{msg['label.address.province']}" 
               rendered="#{address.country eq CountryEnum.UNITED_STATES.country}"/>

我的属性文件包含

label.address.province=Province
label.address.state=State

这很好用,当国家是“美国”时,我的标签输出“州”,而对于任何其他国家,它输出“省”。

我想做的是尝试摆脱两个标签条目,只使用一个,在messages.properties中使用一个choiceformat。我的第一次尝试看起来像:

<h:outputFormat value="#{msg['label.address.province.choice']}">
    <f:param value="#{address.country.id}"/>
</h:outputFormat>

label.address.province.choice={0, choice, 1#Province|2#State|3#Province}

编辑地址时效果很好。但是在添加新地址时,根据我的业务规则,所有字段都是空白的。这意味着 address.country 为空,这意味着我的选择格式产生“空”作为输出。

然后我想使用omnifaces:

<h:outputFormat value="#{msg['label.address.province.choice']}">
    <f:param value="#{o.coalesce(address.country.id, '1')}"/>
</h:outputFormat>

但这也会产生空值。address 是我的托管 bean, country 是我自己的简单 javabean 类, id 是 type 的属性java.io.Serializable

我知道“address.country.id”是由 EL 评估的,当它遇到 null 并且不会抛出 NPE 时,它会“很好地”停止。但是,是不是因为 coalesce 不做这种相同类型的行为,而我传入的必须是非 EL 表达式?抱歉,我刚刚开始我的 JSF 冒险,所以我可能没有使用正确的词。

我也愿意采取完全不同的方法,这仍然会将我的 outputLabels 减少为某种类型的单个标签。

我正在使用 Mojarra 2.1.21、Primefaces 3.5、Omnifaces 1.4.1、Java 7、Tomcat 7

4

1 回答 1

5

这里,

<f:param value="#{o.coalesce(address.country.id, '1')}"/>

有两个(实际上是三个)错误:

  1. 命名空间可能不正确,它至少不是 OmniFaces EL 函数的默认值之一。从OmniFaces 主页

    OmniFaces UI 组件/标记处理程序和 EL 函数在以下 XML 命名空间下可用:

    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions"
    
  2. EL 函数运算符是:,不是.。EL 函数的语法为namespace:functionname(...).

  3. 第三个错误与具体问题无关,是您指定的是字符串而不是数字作为值。#{'1'}应该是的#{1}

所以,总而言之,你应该有

<f:param value="#{of:coalesce(address.country.id, 1)}"/>

您的具体问题是因为#{o}在 EL 范围内的任何地方都可能不作为变量(例如托管 bean)存在,因此评估为null.

于 2013-04-25T20:26:23.713 回答