<f:setpropertyactionlistener> Parent不是ActionSource类型,类型是:com.sun.faces.component.PassthroughElement

时间:2015-12-14 20:16:46

标签: jsf jsf-2.2 passthrough-elements setpropertyactionlistener

我在JSF项目中使用Passthrough元素,需要做类似的事情:

<h:commandLink action="#{myBean.acao()}" value="click me">
        <f:setPropertyActionListener target="#{myBean.object}" value="#{localObject}"/>
</h:commandLink>

但使用Passthrough元素可以更好地控制我的前端,如下所示:

<a href="#" jsf:action="#{myBean.acao()}">click me
        <f:setPropertyActionListener target="#{myBean.object}" value="#{localObject}"/>
</a>

但显然这不起作用,我收到以下错误消息:

<f:setPropertyActionListener> Parent is not of type ActionSource, type is: com.sun.faces.component.PassthroughElement

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

看起来只是Mojarra版本中的一个错误。它适用于我当前最新的2.2.12版本。

您可以使用传递方法参数的EL 2.2功能来解决它​​。另见Invoke direct methods or methods with arguments / variables / parameters in EL。它确实可以在您的环境中使用#include <stdio.h> #include <sys/mman.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <signal.h> #define MAX_PIDS 28 volatile pid_t *pids; void kPid(int x) { int c; for (c=0; c<10; c++) { if (pids[c] == x) { int status = 0; pids[c] = wait(&status); } else { continue; } } } int main(int argc, char **argv) { int c; pid_t pid; pids = mmap(0, MAX_PIDS*sizeof(pid_t), PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); memset((void *)pids, 0, MAX_PIDS*sizeof(pid_t)); for (c=0; c<10; c++) { pid = fork(); if (pid == 0) { exit(1); } else if (pid < 0) { perror("fork failed"); } else { pids[c] = pid; } } int t; char test[50]; snprintf(test,sizeof(test),"ps -ef | grep defunct",pids[c]); system(test); printf("Kill child: "); scanf("%d",&t); kPid(t); system(test); exit(0); } 显然没有抛出EL异常(在EL 2.2之前不支持此语法)。

#{myBean.acao()}

如果您绝对需要在动作侦听器事件期间调用setter,例如因为如果设置值无效,您想通过抛出<a href="#" jsf:action="#{myBean.acao(localObject)}">click me</a> 来控制action的调用,请参阅Differences between action and actionListener,然后声明AbortProcessingException。< / p>

jsf:actionListener