Richfaces树上的ConcurrentModificationException

时间:2012-04-03 12:55:18

标签: jsf tree richfaces

当我实现了一个动态加载节点的rich:tree时,我收到了一个ConcurrentNodificationException。

我正在使用JSF1.2,Tomcat 6.0,RichFaces 3.3.3和Java 6u31。

在JSF页面中我有这个丰富的树组件

<rich:tree id="treeAreas" value="#{areaArmazenamento.treeAreas}"
    var="node"
    adviseNodeOpened="#{storageArea.adviseNodeOpenedTreeAreas}"
    adviseNodeSelected="#{storageArea.adviseNodeSelectedTreeAreas}"
    ajaxSubmitSelection="true"
    componentState="#{storageArea.treeAreasState}"
    nodeSelectListener="#{storageArea.selectNodeArea}"
    nodeFace="#{node.type}" similarityGroupingId="true"
    ondragstart="hideContextMenu();" disableKeyboardNavigation="true"
    rightClickSelection="true" toggleOnClick="true" requestDelay="150"
    changeExpandListener="#{storageArea.expandNodeListener}">

在Managed Bean storageArea中,我有一个加载节点的代码,并且在第一次调用该方法时,加载了第一级节点,当一个节点点击该节点的子结构时。

在加载时,第一级验证用户的权限,并且此验证使用存储树节点的列表的迭代器,此验证删除用户访问被拒绝的节点。有人这样:

List<AreaArmazenamento> areas = root.getPastas();
synchronized (areas) {      
    Iterator<AreaArmazenamento> it = areas.iterator();
    while(it.hasNext())
    {
        area = it.next();
        boolean havePermission = ControllerPermission.havePermission(null, area, Permissions.VIEW, false);
        if(!havePermission)
        {
                it.remove();
        }
    }
}

当我点击任何节点时,我选择数据库的子节点并在所选节点中添加子结构,这有效但有时在select节点上会在Hashtable上抛出ConcurrentNodificationException,它位于Rich Tree的TreeDataModule中。

这是一个例外的痕迹:

Caused by: java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1031)
at org.richfaces.model.TreeDataModel.doWalk(TreeDataModel.java:136)
at org.richfaces.model.TreeDataModel.doWalk(TreeDataModel.java:154)
at org.richfaces.model.TreeDataModel.doWalk(TreeDataModel.java:154)
at org.richfaces.model.TreeDataModel.walk(TreeDataModel.java:178)
at org.richfaces.component.UITree.walk(UITree.java:422)
at org.richfaces.renderkit.TreeRendererBase.writeContent(TreeRendererBase.java:683)

有关它的任何信息都可能导致此错误?为什么?

2 个答案:

答案 0 :(得分:2)

我发现了问题...

  while(it.hasNext())
{
    area = it.next();
    boolean havePermission = ControllerPermission.havePermission(null, area, Permissions.VIEW, false);
    if(!havePermission)
    {
            it.remove(); //problem here
    }
}

我正在迭代中删除列表中的项目......

答案 1 :(得分:1)

您是否尝试过使用a4j:queue?