如何使用omnifaces coalesce将空值转换为数字,以便在ChoiceFormat中使用

Mik*_*Wpg 2 jsf omnifaces

我目前有以下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}"/>
Run Code Online (Sandbox Code Playgroud)

我的属性文件包含

label.address.province=Province
label.address.state=State
Run Code Online (Sandbox Code Playgroud)

这样做很好,当国家是"美国"时,我的标签输出"州",而对于任何其他国家,它输出"省".

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

<h:outputFormat value="#{msg['label.address.province.choice']}">
    <f:param value="#{address.country.id}"/>
</h:outputFormat>
Run Code Online (Sandbox Code Playgroud)

label.address.province.choice={0, choice, 1#Province|2#State|3#Province}
Run Code Online (Sandbox Code Playgroud)

在编辑地址时哪个工作正常.但是,根据我的业务规则添加新地址时,所有字段都是空白的.这意味着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>
Run Code Online (Sandbox Code Playgroud)

但这也产生了空.address是我的托管bean,country是我自己的简单javabean类,id是type的属性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

Bal*_*usC 5

这里,

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

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

  1. 命名空间可能不正确,它至少不是OmniFaces EL函数的默认命名空间.来自OmniFaces主页:

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

    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions"
    
    Run Code Online (Sandbox Code Playgroud)
  2. EL函数运算符:不是..EL函数具有的语法namespace:functionname(...).

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

所有的一切,你应该拥有

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

您的具体问题是由于#{o}可能不会作为变量(例如托管bean)存在于EL范围内的任何位置并因此进行评估null.