当我有条件地使用 <c:if>
的复合组件时,出现重复 ID 异常
我知道这个编译/渲染时间问题,但我真的不知道为什么下面的示例不起作用。
请看以下三个简单的片段
一个名为 TestBean 的 session 作用域 bean,它包含一个 bool 值和两个 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>
还有一个 View 页面,允许在隐藏/显示此复合组件之间切换
<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:text 已在 View 中找到”
它提示“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 人员创建一个错误。
最佳答案
这绝对是 Mojarra 中的一个错误,与在某些情况下处理动态组件树修改有关。
我已经创建了一个重现器,提交了一个问题,并将我的发现写到了 mojarra dev 邮件列表中。更多内容请阅读https://github.com/tuner/mojarra-dynamic-include-reproducer
关于jsf - 使用 <c :if> with composite component 时出现重复 ID 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42863043/