0

我有两个非常相似的用例,一个有效,另一个无效。我已经检查了其他答案中提到的基本内容(JBoss 7.1.1 上的 JSF2.1 和 PrimeFaces 3.3)。

首先是有效的样本:

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

在第二个示例中,传递给操作方法的任务始终为 NULL。如果我只是将任务的属性传递给方法,例如#{taskList.claimTask(v_task.id)}(任务有一个返回字符串的 getId() 方法)并将操作方法​​签名更改为public String claimTask(String id)......我传入的所有内容都是 NULL。

为什么在第一个样本中没有发生这种情况?在那里我传入了两个字符串,它工作正常......

4

1 回答 1

0

您的 RuntimeService bean 的范围是什么?尝试将您的 TaskList bean 范围更改为 ViewScoped 或 SessionScoped,原因如下:

@RequestScoped:一个请求范围的 bean 的生命周期正好是一个 HTTP 请求/响应。 因此,一旦您的带有 commandLinks 的 dataTable 被渲染(HTTP 请求/响应结束),您将丢失action="#{taskList.claimTask(v_task)}"调用中对v_task参数的所有引用。

@ViewScoped:只要您与同一个 JSF 视图交互,视图范围的 bean 就会存在。 即使在渲染结束后,由于@ViewScope,您仍然可以对v_task对象进行引用。

于 2012-08-31T18:51:57.433 回答