Action jsf

Bom dia.

Bem estou com o seguinte problema, tenho 1 menu que terá o valor de sua action modificada dinâmicamente, pergunto aos senhores, pois nas minhas tentativas de pegar o valor da action (método da classe) que será chamado diretamente do banco de dados: ou seja, terei 1 objeto que terá um campo acao, esse campo terá o valor de 1 EL ex:

<ui:repeat var="menu" value="#{menuControl.listFuncionalidadesPai}">
        <li>
          &lt;p:commandLink rendered="#{menu.identificadorStatus == 'A' and menu.idAgr == 'N'}" [b]action="#{menu.acao}"[/b] process="@this" immediate="true"&gt;
          	<i ></i>
            	&lt;h:outputText value="#{menu.nmFun}" /&gt;
	  &lt;/p:commandLink&gt;
	</li>
&lt;/ui:repeat&gt;

O valor do campo acao seria : #{menuControl.principal()} = Método que preciso que seja chamado.

Porém o jsf entende que o acao seria o método a ser usuado pela classe, com isso pergunto alguem sabe dizer se é possível utilizar as actions dessa forma?

Desde já grato :slight_smile:

De que forma? O valor que você define na action é o método que você quer que seja invocado no ManagedBean

Assim rodrigo, acredito que não fui claro… no código acima tenho minha action: action="#{menu.acao}", porém o atributo acao tem o seguint valor “principal()”, eu pensei que o jsf iria interpretar da seguinte maneira:

<p:commandLink rendered="#{menu.identificadorStatus == 'A' and menu.idAgr == 'N'}" [b]action="#{menu.principal()}"[/b] process="@this" immediate="true">  // Como achei que o jsf iria interpretar

Porém ele está interpretando ainda da seguinte forma, pois ele intende que o EL #{menu.acao} é 1 chamada a método e não um valor.

Segue a msg de erro:

10:53:13,047 AVISO [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-localhost-127.0.0.1-8080-5) #{menu.dsArqApl}: javax.el.MethodNotFoundException: /WEB-INF/template/sidebar.xhtml @69,160 action="#{menu.dsArqApl}": Method not found: br.com.model.Funcao@6662f573.dsArqApl(): javax.faces.FacesException: #{menu.dsArqApl}: javax.el.MethodNotFoundException: /WEB-INF/template/sidebar.xhtml @69,160 action="#{menu.dsArqApl}": Method not found: br.com.model.Funcao@6662f573.dsArqApl()
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:110) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
	at com.sun.faces.facelets.component.UIRepeat.broadcast(UIRepeat.java:911) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
	at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:935) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at br.com.control.BaseFilter.doFilter(BaseFilter.java:33) [jCBF.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.10.Final.jar:]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:154) [jboss-as-web-7.1.0.Final.jar:7.1.0.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.10.Final.jar:]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.10.Final.jar:]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.10.Final.jar:]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.10.Final.jar:]
	at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_45]
Caused by: javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /WEB-INF/template/sidebar.xhtml @69,160 action="#{menu.dsArqApl}": Method not found: br.com.model.Funcao@6662f573.dsArqApl()
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:92) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	... 28 more
Caused by: javax.el.MethodNotFoundException: /WEB-INF/template/sidebar.xhtml @69,160 action="#{menu.dsArqApl}": Method not found: br.com.model.Funcao@6662f573.dsArqApl()
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]

Será que consegui explicar?

Vamos lá. Se você define o atributo com uma EL, ele irá interpretar como se fosse o nome de um método, assim:action="#{meuBean.nomeDoMetodo}"Agora se colocar a String diretamente, ele interpreta como valor action="paginaQueQueroIr"Qual desses dois você está tentando fazer? Lembrando que não tem nenhum problema em o método invocado retornar esse valor. Assim:public String nomeDoMetodo(){ return "paginaQueQueroIr"; }

[quote=Rodrigo Sasaki]Vamos lá. Se você define o atributo com uma EL, ele irá interpretar como se fosse o nome de um método, assim:action="#{meuBean.nomeDoMetodo}"Agora se colocar a String diretamente, ele interpreta como valor action="paginaQueQueroIr"Qual desses dois você está tentando fazer? Lembrando que não tem nenhum problema em o método invocado retornar esse valor. Assim:public String nomeDoMetodo(){ return "paginaQueQueroIr"; }[/quote]

Rodrigo, estou passando o método como valor, como disse no action="#{menu.acao}" o acao é substituido pelo nome dos métodos, que estão cadastrados na base de dados.
Ou seja, no meu action eu chamo uma string e não um método.

Você não vai conseguir fazer ele substituir o valor da EL, o máximo que você pode fazer é invocar o método dentro do método acao mesmo.

Como eu poderia implementar dessa forma?