我目前有以下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为null,这意味着我的choiceformat生成'null'作为输出。
然后我想用omnifaces:
<h:outputFormat value="#{msg['label.address.province.choice']}">
<f:param value="#{o.coalesce(address.country.id, '1')}"/>
</h:outputFormat>
但是这也会产生null。 address是我的托管bean,country是我自己的简单javabean类,id是类型java.io.Serializable
的属性。
我知道“address.country.id”是由EL评估的,当它遇到null并且不会抛出NPE时它“很好地”停止。但是,合并是否可能不会做同样类型的行为,我传入的内容必须是非EL表达式?对不起,我刚刚开始我的JSF冒险,所以我可能没有使用正确的单词。
我也很乐意采用一种完全不同的方法,这仍然会将outputLabels减少为某种类型的单个标签。
我正在使用Mojarra 2.1.21,Primefaces 3.5,Omnifaces 1.4.1,Java 7,Tomcat 7
答案 0 :(得分:5)
下面,
<f:param value="#{o.coalesce(address.country.id, '1')}"/>
有两个(实际上是三个)错误:
命名空间可能不正确,它至少不是OmniFaces EL函数的默认命名空间。来自OmniFaces homepage:
OmniFaces UI组件/标签处理程序和EL函数在以下XML名称空间下可用:
xmlns:o="http://omnifaces.org/ui" xmlns:of="http://omnifaces.org/functions"
EL函数运算符为:
,而不是.
。 EL函数的语法为namespace:functionname(...)
。
第三个与具体问题无关的错误是你指定一个字符串而不是一个数字作为值。 #{'1'}
应该是#{1}
。
所以,总而言之,你应该有
<f:param value="#{of:coalesce(address.country.id, 1)}"/>
导致您的具体问题是因为#{o}
可能不会作为变量(例如托管bean)存在于EL范围内的任何位置,因此评估为null
。