ConcurrentModificationException в дереве Richfaces - PullRequest
4 голосов
/ 03 апреля 2012

Я получил исключение 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)

что-нибудь может вызвать эту ошибку?а почему?

Ответы [ 2 ]

2 голосов
/ 07 мая 2012

Я нашел проблему ...

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

Я удалял элементы из списка на итерации ...

1 голос
/ 04 апреля 2012

Вы пробовали использовать a4j: очередь?

...