我有两个非常相似的用例,一个有用,另一个没有。我已经检查了其他答案中提到的基本内容(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="Ü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。
为什么第一个样本不会发生这种情况?在那里,我通过两个字符串,它工作正常......
答案 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 对象上获得引用。