2

PrimefacesselectOneMenuでOmniFacesコンバーターを使用する際に問題が発生しました。セル内編集機能を備えたprimefacesデータテーブルに部門のリストを表示しています。一方の列には部門名が表示され、もう一方の列には学部名が表示されます。編集時に、selectOneMenuは選択する学部のリストとともに正しく表示されますが、送信時に保存されません。データテーブルの学部列を削除すると、部門名が問題なく保存されます。誰かが私ができない理由を見つけるのを手伝ってくれます。学部名を保存します。

これが私のデータテーブルコードです

<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メソッドですpublicvoidonEdit(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();

    }
}

これがupdateメソッドです-hibernatesave()メソッドを使用します

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;
}

}

4

2 に答える 2

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}">

この具体的な問題は、コンバーターとはさらに無関係です。それはその仕事をうまくやっています。

于 2013-03-29T12:00:22.817 に答える
0

間違った質問です。JSF はプレゼンテーション フレームワークであり、ストレージ/ビジネス ロジックを処理しません。

バッキング Bean では、適切なメソッドがストレージを処理する必要がありますが、Bean がどこから来るかは無視されます。手動 (JDBC) または ORM フレームワーク (Hibernate、JPA) で行うことができます。

ところで、「選択したオブジェクトが に保存されていないのはなぜdepartmentMB.selectedFacultyですか?」という質問がある場合、コンバーターは実装されていません。getAsObject()

于 2012-08-14T23:58:36.767 に答える