私のアプリケーションでは、primefacesの編集可能なデータテーブルを使用しています。これらのList(cmFieldsList)値は、リクエストパラメーター(blkcode)に基づいて動的にレンダリングする必要があります。
コンストラクターでリストを初期化すると、データテーブルオブジェクトを編集して保存できます。私のアプリケーションでは、リクエストパラメータに基づいて動的リストが必要になるたびに、コンストラクタで初期化しないと、データを編集したり、データテーブルに保存したりできませんでした。初期化せずに同じものを編集しようとすると、以下のような例外が発生します
原因:java.lang.IllegalArgumentException:行は、org.primefacesのjavax.faces.component.UIData.getRowData(UIData.java:433)のjavax.faces.model.ListDataModel.getRowData(ListDataModel.java:69)で使用できません。 .component.datatable.DataTable.queueEvent(DataTable.java:522)at org.primefaces.component.behavior.ajax.AjaxBehaviorRenderer.decode(AjaxBehaviorRenderer.java:42)at javax.faces.component.behavior.ClientBehaviorBase.decode(ClientBehaviorBase .java:64)org.primefaces.renderkit.CoreRenderer.decodeBehaviors(CoreRenderer.java:329)at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:57)
したがって、コンストラクターで初期化せずに、これをどのように達成できますか。
私のJSFマネージドBeanコードは
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;
}
}
リクエストパラメータをマネージドBeanに送信するための私のJSFコードは
<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>
datatableにリストするための私のJSFコードは
<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>