2012-04-03 15 views
4

Ich empfing eine ConcurrentNodificationException, wenn ich einen Rich: Tree mit dynamischem Laden der Knoten implementierte.ConcurrentModificationException auf Richfaces-Struktur

Ich verwende JSF1.2, Tomcat 6.0, RichFaces 3.3.3 und Java 6u31.

in JSF-Seite Ich habe diese reichen Baumkomponente

<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}"> 

In Managed Bean storageArea I'have den Code, den Lastknoten und auf der ersten Zeit wird die Methode die erste Ebene der Knoten geladen wird aufgerufen, wenn Durch einen Klick in einen Knoten wird die Unterstruktur dieses Knotens geladen.

Beim Laden der ersten Ebene werden die Berechtigungen des Benutzers überprüft, und diese Validierung verwendet den Iterator der Liste, der die Baumknoten speichert. Diese Überprüfung entfernt Knoten, denen der Benutzerzugriff verweigert wird. einige wie folgt aus:

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(); 
     } 
    } 
} 

Wenn ich auf jedem Knoten klicken, wähle ich den Unterknoten der Datenbank und den Unterbau in ausgewählten Knoten, um diese Funktion aber manchmal auf ausgewählten Knoten hinzufügen ConcurrentNodificationException auf Hashtable throwed, die in TreeDataModule ist von reichem Baum.

Dies ist eine Spur von Ausnahme:

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) 

etwas dagegen diesen Fehler verursachen können? und warum?

Antwort

2

ich das Problem gefunden ...

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

Ich war auf Iteration Elemente aus der Liste zu entfernen ...

1

Haben Sie versucht, mit a4j: queue?

Verwandte Themen