JSF2:并不总是调用commandLink操作方法

时间:2012-08-31 08:12:43

标签: jsf-2

我有两个非常相似的用例,一个有用,另一个没有。我已经检查了其他答案中提到的基本内容(JBF 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);

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

为什么第一个样本不会发生这种情况?在那里,我通过两个字符串,它工作正常......

1 个答案:

答案 0 :(得分:0)

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

@RequestScoped:请求范围的bean的生命周期恰好是一个HTTP请求/响应。 因此,一旦您的dataTable与commandLinks一起呈现(HTTP请求/响应结束),您将失去 action =“#{taskList.claimTask(v_task)}中 v_task 参数的所有引用” 来电。

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