Ну, у меня есть составной компонент ниже:Составной компонент с ошибкой в JSF
<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>
Когда я нажимаю в этом CommandButton 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 под названием дважды. Еще одно важное замечание: я привязываю данные к данным, я не знаю, может ли это вызвать эту проблему.
Edit 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>
Edit 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" />
Я отредактировал мое сообщение с дополнительной информацией. – Shelly
хорошо, поэтому старайтесь использовать action = "emoveSelected" или listener = "# {removeSelected" – TinyOS
Но мне нужно использовать 'acaoDestino', а не 'removeSelected() ", потому что actionListener может измениться. – Shelly