jsf - JSF 中出现错误的复合组件

标签 jsf composite-component

嗯,我有下面的复合组件:

<composite:interface>
<composite:attribute name="acaoDestino" required="true"
        shortDescription="Método que será executado quando o usuário clicar no botão 'Sim'." />
</composite:interface>
<composite:implementation>
<h:commandButton actionListener="#{cc.attrs.acaoDestino}"
                        class="btn btn-primary" value="Sim">
                        <f:ajax render="@all" execute="@all" />
                    </h:commandButton>
</composite:implementation>

当我单击此命令按钮时,actionListener (acaoDestino) 会被调用两次。在第一次调用中,该方法运行正常,但在第二次调用中出现错误:

Jan 31, 2015 7:00:32 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
Grave: javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.acaoDestino}'
    at com.sun.faces.facelets.tag.TagAttributeImpl$AttributeLookupMethodExpression.invoke(Unknown Source)
    at javax.faces.event.MethodExpressionActionListener.processAction(Unknown Source)
    at javax.faces.event.ActionEvent.processListener(Unknown Source)
    at javax.faces.component.UIComponentBase.broadcast(Unknown Source)
    at javax.faces.component.UICommand.broadcast(Unknown Source)
    at javax.faces.component.UIViewRoot.broadcastEvents(Unknown Source)
    at javax.faces.component.UIViewRoot.processApplication(Unknown Source)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(Unknown Source)
    at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
    at javax.faces.webapp.FacesServlet.service(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at br.com.jwebbuild.filter.LoginFilter.doFilter(LoginFilter.java:73)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

重要提示:我不希望这个 actionListener 被调用两次。另一个重要的注意事项是我正在绑定(bind)数据表,我不知道这是否会导致此问题。

编辑 1

我的 acaoDestino 是 ManagedBean 中的一个方法,参见:

public void removeSelected() {
...
}

直接在commandButton中使用会像这样:

<h:commandButton actionListener="#{myManagedBean.removeSelected()}"
                        class="btn btn-primary" value="Sim">
                        <f:ajax render="@all" execute="@all" />
                    </h:commandButton>

编辑 2(我使用的是 JSF 2.2.9)

我编辑了我的属性 acaoDestino 放置方法签名

<composite:attribute name="acaoDestino" required="true" method-signature="void actionListener()"
        shortDescription="Método que será executado quando o usuário clicar no botão 'Sim'." />

现在我收到以下错误:

Advertência: java.lang.IllegalArgumentException: wrong number of arguments
javax.el.ELException: java.lang.IllegalArgumentException: wrong number of arguments

我在另一个复合组件中使用复合组件,请看:

<jw:confirmButton
            acaoDestino="#{cc.attrs.managedBeanName.removeSelected()}"
            value="Remover Selecionados" />

最佳答案

首先,您必须指定一个方法签名,以便 JSF 知道它是方法表达式而不是值表达式,您的复合组件应如下所示:

<composite:interface>
        <composite:attribute name="acaoDestino" required="true" method-signature="void actionListener()"
                shortDescription="Método que será executado quando o usuário clicar no botão 'Sim'." />
</composite:interface>
<composite:implementation>
        <h:commandButton actionListener="#{cc.attrs.acaoDestino}" class="btn btn-primary" value="Sim">
               <f:ajax render="@all" execute="@all" />
        </h:commandButton>
</composite:implementation>

第二,如果您不使用 EL 2.2,则应该使用此签名(请参阅 JSF - actionListener tag calls method which doesn't take an ActionEvent parameter ):

public void removeSelected(ActionEvent e) {
...
}

在这种情况下,您的方法签名属性将变为:

method-signature="void actionListener(ActionEvent e)

注意:命令组件在激活时提交请求,因此无需使用 <f:ajax render="@all" execute="@all" />当您刷新整个页面时。

关于jsf - JSF 中出现错误的复合组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28257052/

相关文章:

java - 向复合组件添加操作方法

jsf - 自定义 h :selectOneRadio with other components 的布局和标签

java - 来自外部 jar 的 seam i18n 属性文件

java - JSF 2.0 将动态表单保存到数据库

jsf-2 - 如何在一个命名空间下捆绑多个 JSF2 复合组件库

jsf-2 - :param to composite components

jsf - PrimeFaces.current().focus 不适用于 commandButton

java - 为什么这个简单的文件上传不起作用?日本科学基金会

jsf - 在 JSF2 中,如何知道复合组件是否有子组件?

java - 找不到 JSF 2.1.13 自定义组件 : Tag Library supports namespace: <namsepace> but no tag was defined for name: <compositecomponent>