2012-07-31 43 views
7

我只在JSF隊列中存在全局消息時才試圖顯示一個塊。使用EL來測試全局消息存在的JSF

我試圖使用rendered="#{not empty facesContext.getMessageList(null)}",但它總是評估爲false。

我發現的唯一方法是創建一個自定義EL函數並在java中測試它。

例如。 : 我的EL功能:

public static boolean isFacesGlobalMessages() { 
    return ! FacesContext.getCurrentInstance().getMessageList(null).isEmpty(); 
} 

JSF頁面:

<h:panelGroup class="block1" layout="block" rendered="#{el:isFacesGlobalMessages()}"> 
    <div class="block-warn-body"> 
    <rich:messages id="msg" globalOnly="true"/> 
    </div> 
</h:panelGroup> 

我用鑽嘴魚科2.1.5。

我錯過了什麼嗎? 謝謝!

編輯:嘗試了以下的建議,但至今沒有運氣:

  • #{not empty facesContext.getMessageList(null)} - >總是假
  • #{! facesContext.getMessageList(null)} - >錯誤
  • #{! empty facesContext.getMessageList(null)} - >總是假
  • #{fn:length(facesContext.getMessageList(null)) > 0} - >總是假
  • #{not empty facesContext.messageList(null)} - >錯誤:未找到方法messageList
  • #{not empty facesContext.messageList} - >如果它是一個驗證錯誤返回true(我只希望在全局錯誤真)
  • #{! facesContext.getMessageList(null).isEmpty()} - >拋出IllegalAccessException:類javax.el.BeanELResolver不能訪問類java.util.Collections中的$ UnmodifiableCollection成員使用修改 「公共」
+0

您是否試圖按照與您的功能相同的方式編寫它。 EL意識到!運營商。 – Paranaix 2012-07-31 09:09:50

+0

謝謝!剛剛嘗試(見上面的編輯),但它沒有奏效 – gonzalad 2012-07-31 18:10:51

+0

@gonzalad,不知道它是否適合你,但我更新了我的答案... – Daniel 2012-07-31 18:44:49

回答

18

不需要定製EL功能

試試這個

rendered="#{not empty facesContext.messageList}" 

編輯

還沒有嘗試過自己,但嘗試

rendered="#{not empty facesContext.messageList(null)}" 

一個想法......

rendered="#{not facesContext.validationFailed and not empty facesContext.messageList}" 
+1

'FacesContext#getMessageList()'返回**所有**消息,也是非全局消息。 – BalusC 2012-07-31 10:54:48

+0

嘗試了#{not empty facesContext.messageList(null)},但它會生成一個異常(請參閱上面的編輯以獲取更多信息) – gonzalad 2012-07-31 18:12:12

+0

如果您想查明消息在消息列表中並且沒有驗證失敗的情況時間,看看我編輯的答案.... – Daniel 2012-07-31 18:30:55

1

試試這個:

rendered="#{not empty facesContext.getMessageList(null)} 

而不是:

rendered="#{not empty facesContext.messageList(null)}" 

在Daniel的答案中。

或者這一個:

rendered="#{not empty facesContext.getMessageList('inputForm')} 

其中 'inputForm' 是:

<h:form id="inputForm"> 
... 
</h:form> 

,如果你想解決它只能在網頁上的幾種形式之一。

1

我知道這是一個古老的線索,但在努力尋找難以捉摸的解決方案之後,我找到了這種行爲的解釋,並且由於我無法在任何地方找到此解釋(不知道爲什麼),我認爲這可能會有所幫助。

我製成EL函數輕微不同:

public static boolean hasMessages(String clientId) { 
    return !FacesContext.getCurrentInstance().getMessageList(clientId).isEmpty(); 
} 

所不同的是該參數clientId。該功能的行爲與使用#{not empty facesContext.getMessageList(clientId)}完全相同。調試代碼時,我注意到當我用clientId = null調用函數時,函數內部的clientId的值實際上是""(空字符串)。

之後,我諮詢了EL 3.0規格,並發現:

科1.23 - 類型轉換

在預期類型的​​上下文中的每個表達式。表達式評估的結果可能與預期類型完全不匹配,因此將應用以下各節中描述的規則。 [...]

第1.23.2 - 裹脅到字符串

如果A爲空:迴歸 「」[...]

所以,我不要認爲有一種方法可以通過clientId = null請求傳遞null值作爲參數的消息。唯一的方法是有一個函數,可以在不使用參數或測試參數是否設置爲空字符串的情況下執行此操作。

+0

好的。這是Oracle EL impl中的一個已知錯誤,並已在a.o中修復。 WildFly 8.2/GlassFish 4.1及更新版本。 Tomcat稍後在Apache EL中重新引入了相同的錯誤,該錯誤從未得到「固定」並需要自定義EL解析器。相關:http://balusc.omnifaces.org/2015/10/the-empty-string-madness.html – BalusC 2016-04-12 07:14:02

+0

@BalusC我實際上使用Glassfish 4。1與Oracle EL impl(v。3.0.1-b03)。也許這不是一個錯誤,因爲它在規範中,但確實有義務實現自定義函數/解析器來做這樣簡單的事情。 – Luciano 2016-04-14 12:03:35

+0

它在3.0.1-b05中修復。也許它是在4.1.1中。 – BalusC 2016-04-14 12:04:24