0

非常によく似たユースケースが 2 つあります。1 つは機能し、もう 1 つは機能しません。他の回答で言及されている基本的なことを確認しました(PrimeFaces 3.3を使用したJBoss 7.1.1のJSF2.1)。

最初に動作するサンプル:

<h:form id="processInstanceList">
    <p:dataTable id="instances" var="processInstance" value="#{processInstanceList}">
    ...
        <p:column>
            <h:commandLink value="#{msg.deleteButtonLabel}"
                action="#{runtimeService.deleteProcessInstance(processInstance.id, 'Cancelled by user')}">
        </h:commandLink>

アクション メソッドのシグネチャを使用:

void deleteProcessInstance(String processInstanceId, String deleteReason);

そして今、動作しないサンプル:

<h:form id="taskGrouplist">
    <p:dataTable id="groupTasks" value="#{groupTaskList}" var="v_task">
    ...
        <p:column>
            <h:commandLink value="&Uuml;bernehmen" action="#{taskList.claimTask(v_task)}"/>

アクション メソッドのシグネチャを使用:

@Named
@RequestScoped
public class TaskList {
    public String claimTask(Task task);

2 番目のサンプルでは、​​アクション メソッドに渡されるタスクは常に NULL です。タスクの属性をメソッドに渡すだけの場合、たとえば#{taskList.claimTask(v_task.id)}(Task には文字列を返す getId() メソッドがあります)、アクション メソッドのシグネチャをpublic String claimTask(String id)... に変更すると、渡すものはすべて NULL になります。

最初のサンプルでこれが起こらないのはなぜですか? そこで 2 つの文字列を渡すと、正常に動作します...

4

1 に答える 1

0

RuntimeService Bean のスコープは? TaskList Bean スコープを ViewScoped または SessionScoped に変更してみてください。理由は次のとおりです。

@RequestScoped:リクエスト スコープ Bean の有効期間は、1 つの HTTP リクエスト/レスポンスのみです。 したがって、commandLinks を含む dataTable がレンダリングされると (HTTP 要求/応答が終了すると) 、 action="#{taskList.claimTask(v_task)}"呼び出しでv_taskパラメーターのすべての参照が失われます。

@ViewScoped:ビュー スコープ Bean は、同じ JSF ビューと対話している限り存続します。 レンダリングが終了した後でも、@ViewScope により、v_taskオブジェクトへの参照がまだ残っています。

于 2012-08-31T18:51:57.433 に答える