【问题标题】:Migration from JSF1.2+Facelets TO JSF2, "component with duplicate id" issue从 JSF1.2+Facelets 迁移到 JSF2,“具有重复 id 的组件”问题
【发布时间】:2012-07-03 10:46:42
【问题描述】:

我正在将应用程序从 JSF1.2/MyFaces+Facelets 迁移到 JSF2.1/MyFaces。我有以下用于 JSF1.2/MyFaces+Facelets 的模板。

<ui:component>
<f:subview id="#{id}">
.
.

<script
function blockLinkClicks(){
    //Disables all the HyperLink Controls to prevent repeated submits
    var allLinks = document.getElementById("#{id}:treeNodeForm").getElementsByTagName('a');
    var count = allLinks.length;
.
.
</script>
.
.
.
<h:form id="treeNodeForm">  
    <h:panelGroup id="treePanelId"> 
        <t:tree2 id="tree2Id" 
            value="#{treeBean.treeModel}" var="node" varNodeToggler="t"
            binding="#{treeBean.component}" clientSideToggle="false" showNav="false">
            <f:facet name="selectableNode">
                <h:panelGrid id="tree2PGridSelNodeId" columns="3" cellpadding="0" cellspacing="0" border="0">
.
.
.

迁移后,我收到以下错误:

java.lang.IllegalStateException:找到具有重复 ID“ma​​inLeftTree:treeNodeForm:tree2Id:tree2PGridSelNodeId”的组件 在 org.apache.myfaces.view.facelets.compiler.CheckDuplicateIdFaceletUtils.checkIds(CheckDuplicateIdFaceletUtils.java:100) 在 org.apache.myfaces.view.facelets.compiler.CheckDuplicateIdFaceletUtils.checkIds(CheckDuplicateIdFaceletUtils.java:116)

我在 SO 中发现了类似的问题,但我无法将解决方案与上述问题联系起来。我试图找到解决方案很多天/几个小时,但找不到。

请提供您的建议和指点,我可以尝试修复,因为我不确定问题出在 f:subview 还是 t:tree2 或 jsf2 facelets 上。

非常感谢您。

问候, 库马尔。

【问题讨论】:

    标签: jsf-2 facelets tomahawk


    【解决方案1】:

    我认为问题是由使用&lt;f:subview id="#{id}&gt;"引起的,这显然会在启用PSS时中断,因为每次构建视图时都会评估EL。首先尝试将 web 配置参数 javax.faces.PARTIAL_STATE_SAVING 设置为 false。或者您可以使用配置参数 javax.faces.FULL_STATE_SAVING_VIEW_IDS 来指示哪些视图需要完全状态保存。也许最好避免 id 中的 EL,并在该部分使用其他策略,但这可能需要对逻辑进行一些更改。

    【讨论】:

    • 非常感谢您的宝贵时间和出色的建议。将 javax.faces.PARTIAL_STATE_SAVING 设置为 false,有效。我以与上述相同的方式在 10 多个页面中使用 subview 和 EL。如果可能,请帮助制定策略以避免子视图 ID 中的 EL。复合组件是替代解决方案吗?如果是的话,我能否像在上面的代码中使用的那样在复合组件定义中使用 Javascript(即,通过 id 获取元素)?
    • 我认为将所有内容包装到复合组件中会更好。改为使用#{id},您可以使用#{cc.clientId},并且通过该更改,您可以再次启用PSS。毕竟,复合组件背后的意图之一是在这种情况下(但不是在所有情况下)替换 facelets 模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2011-12-05
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多