Jsf 使用时出现重复ID异常<;c:如果>;复合材料构件
当有条件地将复合组件与Jsf 使用时出现重复ID异常<;c:如果>;复合材料构件,jsf,jstl,composite-component,Jsf,Jstl,Composite Component,当有条件地将复合组件与 我知道这个编译/渲染时间问题,但我真的不知道为什么下面的示例不起作用。 请看下面三个简单的片段 一个名为TestBean的会话范围bean,其中包含一个布尔值和两个ajax侦听器,将该值更改为true或false: @Named @SessionScoped public class TestBean implements Serializable { private boolean isVisible = false; public void onS
我知道这个编译/渲染时间问题,但我真的不知道为什么下面的示例不起作用。
请看下面三个简单的片段
一个名为TestBean的会话范围bean,其中包含一个布尔值和两个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>
以及一个查看页面,允许在隐藏/显示此复合组件之间进行切换
<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”。。。未按条件添加的组件。
当我不使用复合组件并用标准组件(如
)替换它时,任何东西都可以正常工作。
为了重现错误,重要的是,在同一页上使用复合组件两次,一次使用带条件的组件,另一次不使用带条件的组件
经过进一步的搜索,我发现了另一个家伙,我想他和我有同样的问题。但他的例子看起来更复杂,更难重现。
有人知道这是怎么回事吗?
我的设置是JBoss EAP7和Mojarra JSF 2.2.14(但我也用JSF 2.3.0-m11进行了测试)
有人能证实这个问题吗?
如果是这样,我将为mojarray的家伙们创建一个bug。这肯定是Mojarra中的一个bug,并且与在某些情况下处理动态组件树修改有关
我已经创建了一个复制者,提交了一个问题,并将我的发现写在mojarra dev邮件列表上。请在上阅读更多内容。我在
内部使用
时遇到了同样的问题。
绕过我发现的这个bug的唯一方法是使用
而不是
谁也不能确认这个行为?如果它是当前jsf实现中的一个Bug,我可以接受它,但我在他们的jira bugtracker中没有发现任何东西,目前我不知道我是否做错了什么,或者误解了一些jsf基础知识。我在这里创建了一个Bug:它已被移动到github: