3

<p:dataTable>以下のように行エディタでデータを編集しています。

<p:dataTable value="#{bean.users}" var="user" editable="true">
    <p:ajax event="rowEdit" listener="#{bean.onRowEdit}" />
    <p:ajax event="rowEditCancel" listener="#{bean.onRowEditCancel}" />
    <p:column>
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText value="#{user.firstName}" />
            </f:facet>
            <f:facet name="input">
                <p:inputText value="#{user.firstName}" />
            </f:facet>
        </p:cellEditor>
    </p:column>
</p:dataTable>

バッキング Bean は次のように実装されます。

private List<User> users;

@EJB
private UserService userService;

public List<User> getUsers() {
    users = userService.list();
    return users;
}

cellEditor に新しいデータを入力して送信すると、リスナー メソッドでは使用できません。データベースから呼び出されたデータによって上書きされることに気付きました。

これはなぜ起こり、どうすれば回避できますか?

4

1 に答える 1

5

問題は、ゲッター メソッドでビジネス ロジックを実行することによって発生します。データ テーブルを反復処理するたびに、getter メソッドが呼び出されます。そのため、JSF が送信された値をモデルに設定するためにデータ テーブルを繰り返し処理している間、getter 呼び出しは DB から新しいリストを何度も返します。

getter メソッドでビジネス ロジックを実行することは想定されていません。あなたがスターターである限り、ゲッター (およびセッター) メソッドに触れることは控え、別の場所で 1 回呼び出されたメソッドでジョブを実行することをお勧めします。

@PostConstructここに (および真のサービス/DAO クラス)が必要になる可能性があります。

private List<User> users;

@EJB
private UserService userService;

@PostConstruct 
public void init() {
    users = userService.list(); // Call the DB here.
}

public List<User> getUsers() {
    return users; // Just return the already-prepared model. Do NOT do anything else here!
}

以下も参照してください。

于 2015-01-13T10:18:43.793 に答える