Estive lendo alguns tutoriais na internet e tópicos aqui do fórum sobre a navegação no JSF 2.0, li que não precisamos mais configurar regras no faces-config.xml se não quisermos. O problema é que só consigo fazer a navegação quando utilizo o redirect. Quando utilizo a navegação normal ou implícita sem redirect, não abre a outra página.
Mas não funciona. Só funciona com redirect. Já tentei colocar System.out.println para imprimir quando o ManagedBean for criado e o método for executado, e está tudo ok. Já baixei os jars mais recentes do JSF 2.0, mas sem solução. Ja tentei colocar / antes do nome da página, ou mesmo .jsf no final, mas também não adiantou. Entendo a diferença entre forward e redirect, por isso não queria sempre ter de usar o redirect.
Alguém sabe o motivo ou já passou por esse problema? Estou usando NetBeans 6.9.1 e Tomcat 6, será alguma incompatibilidade?
Tentei com o GlassFish Server 3 (já vem integrado no NetBeans), mas mesmo assim da erro:
INFO: Bean Criado!!
INFO: Metodo abrirChamado executado!!
GRAVE: javax.faces.FacesException: Unexpected error restoring state for component with id j_idt3. Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0.
at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:239)
at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:147)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1446)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457)
at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:223)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:177)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:131)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:430)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:143)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:199)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:161)
at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1427)
at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:231)
... 37 more
Tentei colocar o type=“submit” também, mas foi indiferente. Vou tentar instalar o Tomcat 7 para testar. Estranho que com redirect funciona.
Fiz o teste com o Tomcat 7, também não era esse o problema. Acabou funcionando com o Tomcat 6.
Consegui descobrir, mas não fiquei satisfeito: não esta funcionando pq estava usando Facelets. Quando criei uma nova página sem ser modelo de Facelets, deu certo!!!
Nas versões mais antigas do JSF para usar Facelets tinha que se colocar o renderizador dele no faces-config, mas a partir do JSF 2 não é mais necessário, será que o problema não esta com suas dependências, a lib do facelets esta dentro das suas dependências ?
Ivan, as minhas libs estão ok, o NetBeans não acusa pendências. Como vc disse, o JSF 2.0 já vem com o Facelets incluído. Inclusive consigo criar páginas baseadas em um template, ou seja, o Facelets tá funcionando normalmente. O problema é só com a navegação. Muito estranho. Vou tentar tirar o PrimeFaces também.
Why navigations do not work with PrimeFaces commandButton and commandLink?
PrimeFaces does not support forward based navigations within an ajax request, you need to do redirect instead or set ajax to false.
[quote=Marcio N Carvalho]Cara, estou na mesma situação que você.
Conseguiu descobrir a melhor alternativa?[/quote]
Olá!
Depende muito do seu caso. No meu caso o ajax=false resolveu, porém recarregou toda a página. Isso é porque não foi utilizado o ajax, que carrega de forma assíncrona somente os componentes da página que necessitam de ser atualizados.
A desvantagem é que normalmente perde-se todos os valores dos formulários, pois dependendo do escopo de seu ManagedBean, ele é limpado nessa nova requisição.