ArrayIndexOutOfBoundsException from primefaces getRowData in



我是新来的,已经寻找了很长时间的类似问题,但没有成功。如果此问题已在其他地方解决,请指出我的答案,或者请告诉我在哪里可以阅读相应的文档。谢谢。

情况:我有一个带有动态列的数据表。过滤和排序工作。

我需要实现一个上下文菜单,该菜单读取表中的选定行,并根据所选行的单元格中的值采取不同的操作。当我尝试获取行时 java.lang.ArrayIndexOutOfBoundsException被扔了。

帮助和提示将不胜感激。

谢谢亚瑟

带有列和上下文菜单的数据表:

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

尝试在 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进行延迟加载时,并且我有一个带有按钮的p:dialog。通常用户必须非常非常快速地在对话框中提交表单。

最新更新