使用带有primefaces selectOneMenu的OmniFaces转换器时遇到问题。我在具有单元格编辑功能的primefaces数据表中显示Departments列表,一列显示部门名称,另一列显示教员名称。 在编辑时,selectOneMenu正确显示了一个可供选择但不会在提交时保存的教师列表,当我删除datatable中的教师列时,部门名称保存没有问题,有人帮我找出为什么我不能保存教员姓名。
这是我的数据表代码
<p:dataTable id="deptTable" var="department"
value="#{departmentMB.departmentList}" editable="true"
rowIndexVar="rowIndex">
<p:ajax event="rowEdit" listener="#{departmentView.onEdit}"
update=":deptForm:messages" />
<p:column headerText="Name">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{department.departmentName}" />
</f:facet>
<f:facet name="input">
<h:inputText value="#{department.departmentName}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Faculty">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{department.faculty.facultyName}" />
</f:facet>
<f:facet name="input">
<p:selectOneMenu id="iterator"
value="#{departmentMB.selectedFaculty}"
converter="facultyConverter" label="Faculty">
<f:selectItem itemLabel="Select one" noSelectionOption="true" />
<f:selectItems value="#{facultyMB.facultyList}" var="faculty"
itemLabel="#{faculty.facultyName}" itemValue="#{faculty}" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<p:rowEditor />
</p:column>
</p:dataTable>
这是部门控制员
@ManagedBean(name = "departmentMB")
@RequestScoped
public class DepartmentController implements Serializable {
@ManagedProperty(value = "#{DepartmentService}")
IDepartmentService departmentService;
private static final long serialVersionUID = 1L;
private int department_id;
private String departmentName;
private Faculty selectedFaculty;
.
.
.//getters and setters
这是onEdit方法 public void onEdit(RowEditEvent event){
try {
Department department = (Department) event.getObject();
DepartmentController departmentController = (DepartmentController) FacesContext
.getCurrentInstance().getExternalContext().getRequestMap()
.get("departmentMB");
departmentController.updateDepartment(department);
} catch (Exception e) {
e.printStackTrace();
}
}
这是更新方法 - 使用hibernate save()方法
public void updateDepartment(Department department) {
try {
getDepartmentService().updateDepartment(department);
} catch (DataAccessException e) {
e.printStackTrace();
}
}
最后我的OmniFaces转换器
@FacesConverter("facultyConverter")
public class FacultyConverter extends SelectItemsConverter {
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Integer id = (value instanceof Faculty) ? ((Faculty) value).getFacultyId() : null;
return (id != null) ? String.valueOf(id) : null;
}
}
答案 0 :(得分:1)
在<p:selectOneMenu>
中,您需要在当前迭代的行上设置所选的教师,而不是在父辅助bean上。
换句话说,替换
<p:dataTable ... value="#{departmentMB.departmentList}" var="department">
...
<p:selectOneMenu ... value="#{departmentMB.selectedFaculty}">
通过
<p:dataTable ... value="#{departmentMB.departmentList}" var="department">
...
<p:selectOneMenu ... value="#{department.faculty}">
这个具体问题与转换器无关。它的工作做得很好。
答案 1 :(得分:0)
错误的问题。 JSF是一个表示框架,它不处理存储/业务逻辑。
在你的支持bean中,适当的方法应该处理存储,但它将忽略你的bean来自哪里。您可以手动(JDBC)或使用ORM框架(Hibernate,JPA)
顺便说一句,如果您的问题是“为什么所选对象未存储在departmentMB.selectedFaculty
?”,则您的转换器未实现getAsObject()