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

Jsf 如何使用omnifaces合并将空值转换为数字,以便在ChoiceFormat中使用,jsf,omnifaces,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="#{addr

我目前拥有以下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}"/>
这很好,当国家是“我们”时,我的标签输出“州”,而对于任何其他国家,它输出“省”

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

<h:outputFormat value="#{msg['label.address.province.choice']}">
    <f:param value="#{address.country.id}"/>
</h:outputFormat>
在编辑地址时,它工作得很好。但根据我的业务规则,在添加新地址时,所有字段都是空白的。这意味着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时,它“很好地”停止。但是,也许coalesce不做同样的行为,我传递的一定是非EL表达式?抱歉,我刚刚开始我的JSF冒险,所以我可能没有使用正确的词语

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

我在这里使用的是Mojarra 2.1.21、Primefaces 3.5、Omnifaces 1.4.1、Java 7、Tomcat 7

<f:param value="#{o.coalesce(address.country.id, '1')}"/>
  • EL函数运算符是
    ,而不是
    。EL函数的语法为
    名称空间:functionname(…)

  • 第三个错误(与具体问题无关)是指定字符串而不是数字作为值。
    {'1'}
    应该是
    {1}

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

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

    您的具体问题是因为
    {o}
    不可能作为变量(例如托管bean)存在于EL范围内的任何位置,因此计算结果为
    null

    ,恐怕您的问题只是一个简单的输入错误。它是
    {of:coalesce(…)}
    ,而不是
    {o.coalesce(…)}
    ,其中
    名称空间声明为
    xmlns:of=”http://omnifaces.org/functions“
    。使用EL函数时,请注意冒号而不是句号。也看看哦,该死的,多么愚蠢的错误:/。实际上,我在我的命名空间中将它声明为xmlns:o,在同一页上(为了能够使用枚举),我已经得到了
    ,并且它可以工作。但是,可以肯定的是,将其改为“of”,并使用冒号,我现在得到:javax.el.ELException:Function'of:coalesce'而不是foundoh。嗯。两个名称空间,一个是o,另一个是of。明白了,谢谢。最后一点是“1”应该只是普通的1。否则它是一个
    无法将给定对象格式化为数字的
    异常。
    
    <f:param value="#{o.coalesce(address.country.id, '1')}"/>
    
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions"
    
    <f:param value="#{of:coalesce(address.country.id, 1)}"/>