2016-07-07 9 views
0

Ich bin neu hier und habe lange nach ähnlichen Problemen ohne Erfolg gesucht. Wenn dieses Problem an anderer Stelle gelöst wurde, bitte zeigen Sie mir die Antwort oder bitte zeigen Sie mir, wo ich die entsprechende Dokumentation lesen kann. Vielen Dank.ArrayIndexOutOfBoundsException von primefaces getRowData in dynamischen Spalten

Die Situation: Ich habe eine DataTable mit dynamischen Spalten. Filter- und Sortierarbeiten.

Ich muss ein Kontextmenü implementieren, das eine ausgewählte Zeile in der Tabelle liest und abhängig vom Wert in einer Zelle der ausgewählten Zeile verschiedene Aktionen ausführt. Wenn ich versuche, die Zeile ein java.lang.ArrayIndexOutOfBoundsException wird geworfen.

Hilfe und Tipps würden sehr geschätzt werden.

Danke, Arthur

Die Datentabelle mit Spalten und Kontextmenü:

<p:contextMenu for="dataTable"> 
    <p:menuitem value="Projektnavi" 
       icon="ui-icon-close" 
       actionListener="#{dataView.onContextMenuSelect('PROJEKTNAVI')}"/> 

    <p:menuitem value="Edit NOTIZ" 
       icon="ui-icon-close" 
       actionListener="#{dataView.onContextMenuSelect('NOTIZ')}"/> 

    <p:menuitem value="Edit STATUS" 
       icon="ui-icon-close" 
       actionListener="#{dataView.onContextMenuSelect('STATUS')}"/> 

    <p:menuitem value="Edit COVER" 
       icon="ui-icon-close" 
       actionListener="#{dataView.onContextMenuSelect('COVER')}"/> 

    <p:menuitem value="Edit PFAD" 
       icon="ui-icon-close" 
       actionListener="#{dataView.onContextMenuSelect('PFAD')}"/> 
</p:contextMenu> 

<p:dataTable draggableColumns="true" 
      draggableRows="true" 
      filteredValue="#{dataView.filtered}" 
      id="dataTable" 
      lazy="true" 
      paginator="true" 
      paginatorPosition="bottom" 
      paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" 
      resizableColumns="true" 
      resizeMode="expand" 
      rowIndexVar="rowIndexVar"         
      rows="1000" 
      rowKey="#{layout[column.property]}" 
      rowsPerPageTemplate="5,10,15,20,50,100,200,500,1000,2000,5000" 
      scrollable="true" 
      scrollHeight="100%" 
      selection="#{dataView.selected}" 
      selectionMode="single" 
      sortMode="multiple" 
      style="margin-bottom:0" 
      value="#{dataView.lazyModel}" 
      var="layout" 
      widgetVar="widgetDataTable"> 

    <p:ajax event="rowSelect" listener="#{dataView.onRowSelect}" /> 

    <p:columns columnIndexVar="colIndex" 
       filterBy="#{layout[column.property]}" 
       filterMatchMode="in" 
       filterStyle="display: none; visibility: hidden;" 
       sortBy="#{layout[column.property]}" 
       style="text-align: #{column.align};" 
       value="#{dataView.columns}" 
       width="#{column.width}" 
       var="column"> 
     <f:param name="rowId" value="#{rowIndexVar}" /> 
     <f:facet name="header"> 
      #{column.header} 
     </f:facet> 
     <f:facet name="filter"> 
      <p:inputText id="filter" onkeyup="PF('widgetDataTable').filter()" /> 
     </f:facet> 
     <h:outputText value="#{rowIndexVar} - #{layout[column.property]}" /> 
    </p:columns> 
    <f:facet name="footer"> 
     <p:dialog header="Info" widgetVar="layoutDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false"> 
      <p:outputPanel id="layoutDetail" style="text-align:center;"> 
       <p:panelGrid columns="2" rendered="true"> 
       </p:panelGrid> 
      </p:outputPanel> 
     </p:dialog> 
    </f:facet> 
</p:dataTable> 

Die Säule Modellcode

static public class ColumnModel implements Serializable { 

    private static final long serialVersionUID = -2504875837397753172L; 

    private final String header; 
    private final String property; 
    private final String align; 
    private final Integer width; 

    public ColumnModel(String header, String property, String align, Integer width) { 
     this.header = header; 
     this.property = property; 
     this.align = align; 
     this.width = width; 
    } 

    public String getHeader() { 
     return header; 
    } 

    public String getProperty() { 
     return property; 
    } 

    public Integer getWidth() { 
     return width; 
    } 

    public String getAlign() { 
     return align; 
    } 
} 

Die Column Generation Code:

protected void setDynamicColumns() { 

    String[] columnKeys = dataController.getTableHeaders(); 
    columns = new ArrayList<>(); 
    for (String columnKey : columnKeys) { 
     HashMap<String, Object> columnInfo 
       = dataController.getColumnInfo(layoutName, columnKey); 

     // Get field names and values from ab_umsatz_layout 
     Integer width = (Integer) columnInfo.get("FELD_WIDTH"); 
     String align = (String) columnInfo.get("FELD_ALIGN"); 

     ColumnModel columnModel 
       = new ColumnModel(columnKey.trim().toUpperCase(), 
         columnKey.trim(), align, width); 
     columns.add(columnModel); 
    } 
} 

Die onRowSelect Methode:

public void onRowSelect(SelectEvent selectEvent) { 
    DataTable dataTable = (DataTable) selectEvent.getComponent(); 
    try { 
     Object selectedRow = dataTable.getRowData(); 

     System.out.println(selectedRow); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Die erzeugte Ausnahme:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:418) 
    at java.util.ArrayList.get(ArrayList.java:431) 
    at org.primefaces.model.LazyDataModel.getRowData(LazyDataModel.java:56) 
    at javax.faces.component.UIData.getRowData(UIData.java:371) 
    at de.kma.kmaprojektliste.view.DataView.onRowSelect(DataView.java:86) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:289) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304) 
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) 
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processCustomArgListener(AjaxBehaviorListenerImpl.java:107) 
    at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processArgListener(AjaxBehaviorListenerImpl.java:82) 
    at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:63) 
    at org.primefaces.event.AbstractAjaxBehaviorEvent.processListener(AbstractAjaxBehaviorEvent.java:38) 
    at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106) 
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:805) 
    at javax.faces.component.UIData.broadcast(UIData.java:1086) 
    at javax.faces.component.UIData.broadcast(UIData.java:1108) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:745) 
+0

Haben Sie das Problem gelöst oder haben Sie irgendwelche Anhaltspunkte? Ich bazele das gleiche Problem. – Camelaria

Antwort

1

Try getRowData() Methode in LazyDataModel außer Kraft zu setzen. Sie werden wahrscheinlich ein paar mehr Methoden überschreiben, weil sie mit globalen Variablen dieser Klasse arbeiten und es ist das Problem. versuchen Sie das.

@Override 
 
    public TEntity getRowData() { 
 
     int tempIndex= rowIndex; 
 
     if (tempIndex >= 0 && tempIndex < data.size()) 
 
      return data.get(tempIndex); 
 
     else return null; 
 
    }

Es löste das Problem für mich. Ich bin nicht sicher, ob die Bedingung notwendig ist, aber ich denke, Problem war, dass rowIndex während dieser Methode neu geschrieben wurde und es möglich war, dass es auf -1 festgelegt wurde.

Für mich trat diese Situation nur auf, wenn ich p: datatable mit lazy loading benutzte und darüber ein p: -Dialog mit Schaltflächen hatte. Normalerweise musste der Benutzer das Formular im Dialog sehr schnell einreichen.