In my application, I use datatable editable variables, these List (cmFieldsList) values should be displayed dynamically based on query parameters (blkcode).
If I initialize the list in the constructor, I can edit and save the data objects. For my application, every time a dynamic list is needed based on the query parameters, so without initialization in the constructor, I could not edit or save the data in my datatable. If I try to change the same without initializing, I get an exception as shown below
Called: java.lang.IllegalArgumentException: the row is not available in javax.faces.model.ListDataModel.getRowData (ListDataModel.java:69) in javax.faces.component.UIData.getRowData (UIData.java:433) at org.primefaces.component .datatable.DataTable.queueEvent (DataTable.java∗22) on org.primefaces.component.behavior.ajax.AjaxBehaviorRenderer.decode (AjaxBehaviorRenderer.java:42) in javax.faces.component.behavior.ClientBehaviorBasehase.asecode : 64) at org.primefaces.renderkit.CoreRenderer.decodeBehaviors (CoreRenderer.java:329) at org.primefaces.component.datatable.DataTableRenderer.decode (DataTableRenderer.java:57)
So, without initialization in the constructor, how could I achieve this.
My JSF Managed Bean Code
package com.dynamic.mbeans; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.RequestScoped; import javax.faces.context.FacesContext; import org.primefaces.event.RowEditEvent; import com.dynamic.model.CmFields; import com.dynamic.services.CmFieldService; @ManagedBean(name="cmFieldListBean") @RequestScoped public class CmFieldController implements Serializable { private static final long serialVersionUID = 6250736369064467010L; private CmFields cmFields; private List<CmFields> cmFieldsList; @ManagedProperty(value="#{param.blkCode}") public String blkCode; public CmFieldController(){ cmFields= new CmFields();
My JSF code for sending request parameters to Managed Bean is
<h:form> <h:commandLink action="#{cmFieldListBean.showForms}" value="LIST SALESMAN" > <f:param name="blkCode" value="SALESMAN" /> </h:commandLink> <br/> <br/> <h:commandLink action="#{cmFieldListBean.showForms}" value="LIST SALESMAN COMPANY" > <f:param name="blkCode" value="SALESMAN_COMP" /> </h:commandLink> </h:form>
My JSF code for listing in datatable
<h:form id="form"> <p:growl id="messages" showDetail="true"/> <p:dataTable var="cmList" value="#{cmFieldListBean.cmFieldsList}" id="cmFieldsList" editable="true" preserveDataModel="false"> <f:facet name="header"> Grid Editing </f:facet> <p:ajax event="rowEdit" listener="#{cmFieldListBean.onEdit}" update=":form:cmFieldsList" /> <p:ajax event="rowEditCancel" listener="#{cmFieldListBean.onCancel}" update=":form:cmFieldsList" /> <p:column headerText="Caption" style="width:200px"> <p:cellEditor> <f:facet name="output"> <h:outputText value="#{cmList.fieldCaption}" /> </f:facet> <f:facet name="input"> <p:inputText value="#{cmList.fieldCaption}" style="width:100%"/> </f:facet> </p:cellEditor> </p:column> <p:column headerText="Field Name" style="width:150px"> <p:cellEditor> <f:facet name="output"> <h:outputText value="#{cmList.fieldName}" /> </f:facet> <f:facet name="input"> <p:inputText value="#{cmList.fieldName}" style="width:100%"/> </f:facet> </p:cellEditor> </p:column> <p:column headerText="Data Type" style="width:150px"> <p:cellEditor> <f:facet name="output"> <h:outputText value="#{cmList.dataType}" /> </f:facet> <f:facet name="input"> <p:inputText value="#{cmList.dataType}" style="width:100%"/> </f:facet> </p:cellEditor> </p:column> <p:column headerText="Options" style="width:50px"> <p:rowEditor /> </p:column> </p:dataTable>
source share