当我实现了一个动态加载节点的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)
有关它的任何信息都可能导致此错误?为什么?
答案 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?