2013-04-25 15 views
2

目前,我有以下JSF:如何使用omnifaces合併轉空爲若干個,用於ChoiceFormat

<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> 

不過這也產生空。地址是我的託管bean,國家是我自己的簡單javabean類,id是java.io.Serializable類型的屬性。

我知道「address.country.id」是由EL評估的,當它遇到null並且不拋出NPE時,它「很好」停止。但是,這可能是合併不會做同樣的行爲,我傳入的內容必須是非EL表達式?對不起,我剛剛開始我的JSF冒險,所以我可能不會使用正確的單詞。

我也開始採取一種完全不同的方法,它仍然將我的outputLabels減少爲某種類型的單個標籤。

我用鑽嘴魚科2.1.21,Primefaces 3.5,Omnifaces 1.4.1,Java 7中,Tomcat的7

+0

恐怕你的問題只是一個簡單的錯字。它是'#{of:coalesce(...)}',而不是'#{o.coalesce(...)}''''''''命名空間被聲明爲'xmlns:of =「http://omnifaces.org /功能「'。使用EL功能時請注意冒號而不是句號。另見http://showcase.omnifaces.org/functions/Objects – BalusC 2013-04-25 20:00:20

+0

呵呵,真是個愚蠢的錯誤:/。其實,我已經在我的命名空間中聲明瞭xmlns:o,並且在同一頁面上(爲了能夠使用Enums)我已經有了',它的工作原理。但是,將其更改爲「of」,只是可以肯定的,使用冒號,我現在得到: javax.el.E​​LException:找不到函數'of:coalesce' – MikeCWpg 2013-04-25 20:12:41

+0

哦。咄。兩個命名空間,一個是o,另一個是。得到它了。 – MikeCWpg 2013-04-25 20:18:11

回答

5

這裏,

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

有兩個(實際上,三)錯誤:

  1. 命名空間可能不正確,它至少不是默認的OmniFaces EL函數。從OmniFaces homepage

    的OmniFaces UI組件/ taghandlers和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

+0

謝謝。最後一位是'1'應該是簡單的1.否則它是'不能格式化給定的對象作爲數字'異常。 – MikeCWpg 2013-04-25 21:02:32