2016-07-07 10 views
0

私はここに来て、よく似た問題のためにかなりの時間を探しました。 この問題が他の場所で解決されている場合は、私にその答えを教えてください。ありがとう。ArrayIndexOutOfBoundsException動的な列のprimefaces getRowDataから

状況: 私は動的な列を持つDataTableを持っています。 フィルタリングと並べ替え作業。

テーブル内の選択された行を読み込み、選択した行のセル内の値に応じて異なるアクションを実行するコンテキストメニューを実装する必要があります。 行を取得しようとすると java.lang.ArrayIndexOutOfBoundsException がスローされます。

ヘルプとヒントは非常に高く評価されます。

おかげで、 アーサー

列と、コンテキストメニューでのDataTable:

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

列モデルコード

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

列の生成コード:

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

onRowSelect方法:

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

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

生成された例外:

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

問題を解決しましたか、またはリードがありますか?私は現在、同じ問題を戦っています.. – Camelaria

答えて

1

はLazyDataModelでgetRowData()メソッドをオーバーライドしてみてください。このクラスのグローバル変数で作業しているので、おそらくいくつかのメソッドをオーバーライドすることになりますが、それは問題です。 これを試してください。

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

それは私のために問題を解決しました。条件が必要かどうかはわかりませんが、このメソッドでrowIndexが書き換えられ、-1に設定されている可能性があるという問題があったと思います。

私にとって、この状況はp:datatableとlazy loadingを使用した場合にのみ発生し、ボタンを使用してp:ダイアログが表示されました。通常、ユーザーはダイアログ内のフォームを非常に迅速に提出しなければなりませんでした。

関連する問題