jsf - 使用 <c :if> with composite component 时出现重复 ID 异常

标签 jsf jstl composite-component

当我有条件地使用 <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/

相关文章:

java - 无法将自定义 NavigationHandler 转换为 javax.faces.application.ConfigurableNavigationHandler

java - JSF:MyFaces CODI 类型安全导航和 f:viewParam

java - 不知道如何迭代 forEach ArrayList 对象(购物车)中提供的 "items"

jsf - 如果复合组件内的组件为空,如何不设置该组件的属性?

java - Glassfish 服务器未在 Eclipse 上启动

java - 使用 JSTL 将特定索引的列表项加粗

jsp - 使用 JSTL 创建带有导航链接的菜单

java - 泛型可以作为复合组件属性标签的 "type"吗?

嵌套 JSF 复合组件中的 AJAX

ajax - 避免 richfaces 在 ajax 响应中发回 javascript 库