Primefaces TabView在第三个选项卡上抛出一个空指针

Eva*_*les 3 tabs primefaces jsf-2

我有一个带有三个标签的标签视图.选项卡视图似乎在前两个选项卡更改中正常工作,但在第三个我得到一个空指针,如

java.lang.NullPointerException
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:59)
Run Code Online (Sandbox Code Playgroud)

此外,TabChangeEvents此时具有空数据.

使选项卡的内容最小(只是一行文本),我可以看到选项卡的内容被相互附加.一旦发生这种情况,问题就开始了.

查看PrimeFaces源代码,似乎是在尝试tabToLoad使用生成的检索变量时tabClientId.我不确定它应该在处理新标签的逻辑分支中.

我的标签视图如下所示:

<p:tabView styleClass="entities-tabview" id="tabs" dynamic="true">
    <p:ajax event="tabChange" listener="#{action.onTabChange}"
            update="first-tab,second-tab"/>

    <p:tab title="First Tab" id="first-tab">
        tab one content
    </p:tab>

    <p:tab title="Second Tab" id="second-tab">
        tab two content
    </p:tab>

    <p:tab title="Other Tab" id="other-tab">
        // tab content
    </p:tab>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)

似乎代码检查var参数是否在TabView上设置.因为我们不使用它,所以它是null,所以它进入新的tab分支.Tab键索引在tabview上设置.关于什么可能是错的任何想法?

经过一些调查后,我发现在选项卡上更改了应该更改的选项卡是通过请求参数指定的,并_newTab附加了客户端ID .前两次设置正确,但在更改回选项卡时未设置,因此无法找到选项卡和后续的NPE.

更新原因 当选项卡是动态的,并且ajax事件触发时,选项卡会更改,随后ajax会更新选项卡.这似乎导致两个选项卡都加载到同一选项卡中的问题,这很可能在以后搞乱参数.

但是如何能够执行选项卡更改功能并在选项卡中显示其详细信息?

Ken*_*ark 5

这里的问题是你有更新两个标签的ajax.看来,当它执行此操作时,选项卡的状态会变得混乱,您最终会将两个选项卡的内容合二为一.

您可以通过将内容插入h:panelGroup并更新panelgroup而不是选项卡来绕过它

以下示例

<p:tabView styleClass="entities-tabview" id="tabs" dynamic="true">
  <p:ajax event="tabChange" listener="#{action.onTabChange}"
        update="one-content,two-content,other-content"/>

  <p:tab title="First Tab" id="first-tab">
    <h:panelGroup display="block" id="one-content">
     tab one content
    </h:panelGroup>
  </p:tab>

  <p:tab title="Second Tab" id="second-tab">
    <h:panelGroup display="block" id="two-content">
     tab two content
    </h:panelGroup>
  </p:tab>

  <p:tab title="Other Tab" id="other-tab">
    <h:panelGroup display="block" id="other-content">
     // tab content
    </h:panelGroup>
  </p:tab>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)