In JSF, how to list in editable data without initialization in the init block or in the constructor

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(); //cmFieldsList= new ArrayList<CmFields>(); //cmFieldsList.add(cmFields); } @ManagedProperty("#{cmFieldService}") private CmFieldService cmFieldService; public String showForms(){ System.out.println("blkCode =="+blkCode); cmFieldsList = cmFieldService.listAllCmField(blkCode);//lists CmFields from DB return "dynamic-cmfields-form"; } public void onEdit(RowEditEvent event) { System.out.println("event started"); System.out.println("event ended"); // FacesMessage msg = new FacesMessage("CmFields Edited", ((CmFields) event.getObject()).getBlkCode() ); //FacesContext.getCurrentInstance().addMessage(null, msg); } public void onCancel(RowEditEvent event) { FacesMessage msg = new FacesMessage("CmFields Cancelled", ((CmFields) event.getObject()).getBlkCode()); FacesContext.getCurrentInstance().addMessage(null, msg); } public CmFields getCmFields() { return cmFields; } public void setCmFields(CmFields cmFields) { this.cmFields = cmFields; } public CmFieldService getCmFieldService() { return cmFieldService; } public void setCmFieldService(CmFieldService cmFieldService) { this.cmFieldService = cmFieldService; } public List<CmFields> getCmFieldsList() { return cmFieldsList; } public void setCmFieldsList(List<CmFields> cmFieldsList) { this.cmFieldsList = cmFieldsList; } public String getBlkCode() { return blkCode; } public void setBlkCode(String blkCode) { this.blkCode = blkCode; } } 

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> 

+4
source share
1 answer

change the bean scope to @ViewScoped : the viewport will be used in many cases to support the data table, since you do not need to read the data in the database every time you change the sorting or filtering. Of course, if the list of records you want to show is not too long, and immediately read them all in memory.

0
source

Source: https://habr.com/ru/post/1439956/


All Articles