2017-03-17 63 views
1

在使用複合材料部件時,有條件地與<c:if> 我知道這個的編譯/渲染時間的問題,我得到一個重複的ID例外,但我真的不知道爲什麼下面的例子不工作。 請看看以下三個簡單的片段重複ID例外使用<c:if>與複合材料部件

會話範圍的bean命名testBean就持有一個布爾值和兩個AJAX聽衆此值更改爲true或false:

@Named 
@SessionScoped 
public class TestBean implements Serializable { 

    private boolean isVisible = false; 

    public void onSetItemVisible(AjaxBehaviorEvent e) { 
     this.isVisible = true; 
    } 

    public void onSetItemInvisible(AjaxBehaviorEvent e) { 
     this.isVisible = false; 
    } 

    public boolean isItemVisible() { 
     return this.isVisible; 
    } 
} 

一個真正命名爲testCmp簡單複合部件:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:cc="http://java.sun.com/jsf/composite"> 

    <cc:interface/> 
    <cc:implementation> 
     <h:outputText id="text" value="text"/> 
    </cc:implementation> 
</html> 

並允許隱藏/昭之間的切換的圖頁w此複合組件

<h:body> 
    <h:form id="testForm"> 

     <c:if test="#{testBean.itemVisible}"> 
      <test:testCmp id="test1"/> 
     </c:if> 
     <p/> 

     <test:testCmp id="test2"/> 
     <p/> 

     <!-- show/hide dynamic item --> 
     <h:commandLink value="Show Item"> 
      <f:ajax execute="@this" listener="#{testBean.onSetItemVisible}" render="@form"/> 
     </h:commandLink> 
     <br/> 
     <h:commandLink value="Hide Item"> 
      <f:ajax execute="@this" listener="#{testBean.onSetItemInvisible}" render="@form"/> 
     </h:commandLink> 
    </h:form> 
</h:body> 

事情是:我得到一個重複ID異常當我切換顯示/隱藏。 異常說:「組件ID了testForm:TEST2:文本已經在視圖中找到」

它抱怨「test2的」 ......這是不是有條件地添加的組件。 而當我不使用複合組件並用<h:outputText>等標準組件替換它時,則任何情況都可以。 爲了重現錯誤,重要的是,複合組件在同一頁面使用兩次,一次使用,其他時間不使用該條件。

經過進一步的搜索,我發現了另一個我認爲和我一樣的問題。但他的例子看起來更復雜一些,更難以重現。 Duplicate component ID in JSF using composite component twice in view

任何人都有線索這裏發生了什麼? 我的設置是JBoss EAP7和Mojarra JSF 2.2.14(但我也使用JSF 2.3.0-m11進行了測試) 有人可以證實這個問題嗎? 如果是這樣,我會爲mojarray傢伙創建一個bug。

+0

沒有人可以證實這種行爲? 如果它是當前jsf實現中的一個Bug,我可以忍受它,但是我還沒有在他們的jira bugtracker中找到任何東西,而現在我不知道我是否做錯了什麼或者誤解了一些JSF基礎知識。 – fmueller19

+0

我在這裏創建了一個Bug:https://java.net/jira/browse/JAVASERVERFACES-4240 – fmueller19

+0

它已被轉移到github上:https://github.com/javaserverfaces/mojarra/issues/4244 –

回答

1

當在<cc:implementation>內使用<c:if>時,我得到了同樣的問題。 繞過此錯誤的唯一方法是使用<h:panelGroup rendered="#{condition}">而不是<c:if test="#{condition}">