2015-01-31 9 views
1

Ну, у меня есть составной компонент ниже:Составной компонент с ошибкой в ​​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" /> 

ответ

0

Можете ли вы рассказать мне о acaoDestino, что именно? метод var в вашем бэкбоне? потому что, если это метод или переменная вы должны использовать в buttonCommand действие = "" или слушатель = ""

+0

Я отредактировал мое сообщение с дополнительной информацией. – Shelly

+0

хорошо, поэтому старайтесь использовать action = "emoveSelected" или listener = "# {removeSelected" – TinyOS

+0

Но мне нужно использовать 'acaoDestino', а не 'removeSelected() ", потому что actionListener может измениться. – Shelly

0

Попробуйте использовать:

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

или:

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

атрибут слушателя не существует в commandButton JSF и действие дает мне ту же проблему – Shelly

1

Первый , вы должны указать сигнатуру метода, чтобы 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) 

NB : Компоненты команды отправляют запросы, когда они активированы, поэтому нет необходимости использовать <f:ajax render="@all" execute="@all" />, пока вы обновляете всю страницу.

+0

не работает, я отредактировал свой пост с новой информацией. Я использую JSF 2.2 – Shelly

+0

@ user2776409, пожалуйста, укажите, как использовать составной компонент на странице xhtml? – Tarik

+0

Я отредактировал мой пост – Shelly