2017-03-17 20 views
1

<c:if> 복합 요소를 조건부로 사용할 때 중복 ID 예외가 발생합니다.이 컴파일/렌더링 시간 문제는 알고 있지만 아래 예제가 작동하지 않는 이유에 대해 실감하지 않았습니다. . 다음과 같은 세 가지 간단한 조각<c:if> 복합 요소 사용시 중복 ID 예외

에서 참조하시기 바랍니다 세션 범위 참 또는 거짓이 값을 변경 부울 값과 두 아약스 청취자 보유 TestBean라는 이름의 콩 :

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

숨기기/SHO의 전환 허용하는 페이지 뷰 이 복합체 구성 요소

<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

아무도 단서가 있습니까? Mojarra JSF 2.2.14가 설치된 JBoss EAP7입니다 (그러나 JSF 2.3.0-m11에서도 테스트되었습니다) 누군가이 문제를 확인할 수 있습니까? 그렇다면 mojarray 녀석을위한 버그를 만듭니다.

+0

아무도이 동작을 확인할 수 있습니까? 현재 jsf 구현의 버그 인 경우이를 사용할 수 있지만 jira bugtracker에서 아무 것도 찾지 못했고 현재 뭔가 잘못되었거나 JSF 기본을 오해하고 있는지 전혀 모른다는 단서가 없습니다. – fmueller19

+0

여기에 버그를 만들었습니다 : https://java.net/jira/browse/JAVASERVERFACES-4240 – fmueller19

+0

github로 옮겼습니다 : https://github.com/javaserverfaces/mojarra/issues/4244 –

답변

1

이것은 분명히 Mojarra의 버그이며 특정 상황에서 동적 구성 요소 트리 수정을 처리하는 것과 관련이 있습니다.

나는 재생산기를 만들었고, 문제를 제기하고, 나의 발견에 대해 mojarra dev 메일 링리스트에 썼다. https://github.com/tuner/mojarra-dynamic-include-reproducer

1

안에 <c:if>을 사용할 때 같은 문제가 발생했습니다. 내가 발견 한이 버그를 우회하는 유일한 방법은 <c:if test="#{condition}"> 대신 <h:panelGroup rendered="#{condition}">을 사용하고있었습니다.