如何使用Omnifaces Converter将selectOneMenu中的对象保存到数据库中?

时间:2012-08-14 23:53:57

标签: jsf primefaces converter omnifaces

使用带有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;
}

}

2 个答案:

答案 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()