Я получил исключение ConcurrentNodificationException, когда реализовал rich: дерево с динамической загрузкой узлов.
Я использую 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}">
В управляемом хранилище объектов. У меня есть код, который загружает узлы, и при первом запуске метода вызывается первый уровень узлов,при щелчке по узлу загружается подструктура этого узла.
При загрузке на первом уровне проверяются права пользователя, и при этой проверке используется итератор списка, в котором хранятся узлы дерева, эта проверка удаляет узлы, которыедоступ пользователя запрещен.например, это:
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();
}
}
}
Когда я щелкаю по любому узлу, я выбираю подузлы базы данных и добавляю подструктуру в выбранный узел, этот рабочий, но иногда на выбранный узел генерирует исключение ConcurrentNodificationException в Hashtable, котороев TreeDataModule Rich Tree.
Это исключительная трассировка:
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)
что-нибудь может вызвать эту ошибку?а почему?