我正在尝试在表格中执行插入操作。我在数据表中显示退出记录,并且在选择每一行时,详细信息显示在dataTable下面的panelGrid中。当用户单击“新建”按钮时,将显示带有空白inputText框的panelGrid。用户提交新记录并刷新dataTable。
提交时,我收到错误:
2011年11月22日下午5:02:22 com.sun.faces.lifecycle.ProcessValidationsPhase执行 警告:参数错误:参数targetClass为null java.lang.NullPointerException:参数错误:参数targetClass为null
代码如下:
<p:outputPanel header="MyTable Records" rendered="true" id="panel_MyTable">
<p:dataTable id="table_MyTable" value="#{myBean.records}" var="dataMyTable" onRowSelectUpdate="details_MyTable" selection="#{myBean.currentRec}" update="submitButton">
<p:column>
<f:facet name="header">
<h:outputLabel value="Label 1" />
</f:facet>
<h:outputLabel value="#{dataMyTable.Field1}"/>
</p:column>
<p:column>
<f:facet name="header">
<h:outputLabel value="Label 2" />
</f:facet>
<h:outputLabel value="#{dataMyTable.Field2}"/>
</p:column>
<f:facet name="footer">
<p:commandButton value="New" image="ui-icon ui-icon-add" actionListener="#{myBean.prepareForInsertAction}" update="details_myTable,submitButton" />
</f:facet>
</p:dataTable>
</p:outputPanel>
<h:panelGrid id="details_MyTable">
<h:outputLabel value="Label 1"/>
<p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field1 : myBean.currentRec.Field1}" />
<h:outputLabel value="Label 2"/>
<p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field2 : myBean.currentRec.Field2}" />
</h:panelGrid>
<p:commandButton id="submitButton" actionListener="#{myBean.createAction}" value="Submit" update="table_MyTable,details_MyTable" rendered="#{myBean.editMode ? true : false}"/>
@ManagedBean(name="myBean")
@ViewScoped
public class MyBean
{
public static List<MYTABLE> records;
MYTABLE currentRec;
Boolean editMode=false;
public MyBean(){
records = MYTABLE_CRUD.getAllRecs();
currentRec = new MYTABLE();
}
public void prepareForInsertAction(){
newRec = new MYTABLE();
editMode = true;
}
public void setCurrentRec(MYTABLE v_currentRec) {
this.currentRec = v_currentRec;
editMode = false;
}
}
答案 0 :(得分:2)
那些value
属性不正确:
<p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field1 : myBean.currentRec.Field1}" />
<p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field2 : myBean.currentRec.Field2}" />
可以检索这些值,但无法设置新值。以下语法将起作用:
<p:inputText readonly="#{!myBean.editMode}" value="#{myBean[myBean.editMode ? 'newRec' : 'currentRec'].Field1}" />
<p:inputText readonly="#{!myBean.editMode}" value="#{myBean[myBean.editMode ? 'newRec' : 'currentRec'].Field2}" />
(请注意,我也改进了readonly
属性评估)
但更好的是在两种编辑模式中只使用一个相同的属性,并使用action方法中的编辑模式值来确定如何处理它:
<p:inputText readonly="#{!myBean.editMode}" value="#{myBean.rec.Field1}" />
<p:inputText readonly="#{!myBean.editMode}" value="#{myBean.rec.Field2}" />
与例如
private Record rec;
public void save() {
if (editMode) {
// Treat "rec" as "currentRec".
} else {
// Treat "rec" as "newRec".
}
}
答案 1 :(得分:1)
拥有单个panelGrid,并使用它来查看表行数据,还可以根据panelGrid中inputTexts值的动态绑定来接受用户的新记录详细信息 造成了这个问题。所以,我开始使用两个panelGrids,一个用于查看现有的表行数据,另一个用于接受用户的新记录数据。