[Resolvido] Primefaces - Caused by: java.lang.IllegalStateException: PWC3999:

E ae galera,

Estou tendo problemas com o primefaces, aparece a mensagem de erro abaixo. Isso acontece quando adiciono por exemplo um datatable no meu xhtml. Pesquisei na internet e disseram que atualizando o mojarra do glassfish para versão 2.1.8 resolveria. Fiz isso, baixei essa versão no site, dentro da pasta modules do glassfish substitui o arquivo javax.faces.jar pela versão atualizada. Só que o erro não corrigiu, e o pior é que no log de inicialização do glassfish ainda aparece como sendo a versão 2.1.6. Alguém passou por isso e conseguiu resolver o problemas?

java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2886)
	at org.apache.catalina.connector.Request.getSession(Request.java:2583)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:920)
	at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155)
	at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122)
	at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166)
	at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:419)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)

INFO: Exception when handling error trying to reset the response.
java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2886)
	at org.apache.catalina.connector.Request.getSession(Request.java:2583)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:920)
	at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155)
	at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122)
	at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166)
	at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:419)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)

WARNING: JSF1087: Unable to generate Facelets error page as the response has already been committed.
SEVERE: javax.faces.FacesException: PWC3999: Cannot create a session after the response has been committed
javax.faces.FacesException: PWC3999: Cannot create a session after the response has been committed
	at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:142)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2886)
	at org.apache.catalina.connector.Request.getSession(Request.java:2583)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:920)
	at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155)
	at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122)
	at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166)
	at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:419)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	... 26 more

Amigo, qual escopo estais utilizando?

Olá darksteel3000, a qual escopo se refere?

No teu ManagedBean.

Bean:

@ManagedBean
@RequestScoped
public class PaisController extends ControllerAbstract<Pais,PaisService>
{
    private Pais pais;
    private DataModel listaPaises;
    
    public DataModel getListarPaises() 
    {
      List<Pais> lista = getService().getAll();
      listaPaises = new ListDataModel(lista);
      return listaPaises;
    }

    public Pais getPais()
    {
      return pais;
    }

    public void setPais(Pais pais)
    {
      this.pais = pais;
    }
    
    public void prepararAdicionarPais(ActionEvent actionEvent)
    {
      pais = new Pais();
    }
    
    public void prepararAlterarPais(ActionEvent actionEvent)
    {
      pais = (Pais)(listaPaises.getRowData());
    } 
    
    public String excluirPais()
    {
 
      Pais paisTemp = (Pais)(listaPaises.getRowData());
      getService().remove(paisTemp);
      return "index";
    }
    
    public void adicionarPais(ActionEvent actionEvent)
    {
      getService().insert(pais);
    }   
    
    public void alterarPais(ActionEvent actionEvent)
    {
       getService().update(pais);
    }
    
    public void onRowSelect(SelectEvent event) 
    {  
        FacesMessage msg = new FacesMessage("País Selecionado", ((Pais) event.getObject()).getNome());  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
  
    public void onRowUnselect(UnselectEvent event) 
    {  
        FacesMessage msg = new FacesMessage("Car Unselected", ((Pais) event.getObject()).getNome());  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }   
}

XHTML

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/resources/theme/template.xhtml">
        
  <ui:define name="centro">
    <h:form id="form">  
          
      <!-- Lista -->
      <p:dataTable id="cars" 
                   var="pais" 
                   value="#{paisController.listarPaises}" 
                   rowKey="#{pais.id.codigo}"  
                   selection="#{paisController.pais}" 
                   selectionMode="single" >  
                  
        <p:column headerText="Código"> #{pais.id.codigo} </p:column>  
        <p:column headerText="Nome"> #{pais.nome} </p:column>  
              
        <f:facet name="footer">
          
          <p:commandButton id="newButton" 
                           value="Novo" 
                           actionListener="#{paisController.prepararAdicionarPais}" 
                           oncomplete="dialogFichaPais.show()"
                           />  
          
        </f:facet> 
                
      </p:dataTable>  
  
      <!-- Ficha -->
      <p:dialog header="Gerencia Países" 
                widgetVar="dialogFichaPais"  
                resizable="false" 
                modal="true" 
                width="300" 
                appendToBody="true"
                id="dialogFichaPaisTeste"
                >
        

          
          <h:panelGrid id="infosLivro" columns="2" style="margin-bottom:10px">
            
            <h:outputLabel for="titulo" value="Título:" />
            <h:inputText id="titulo" value="#{paisController.pais.id.codigo}"/>
 
            <h:outputLabel for="filial" value="Filial:" />
            <h:inputText id="filial" value="#{paisController.pais.id.filial.id.codigo}"/>
            
            <h:outputLabel for="autor" value="Autor:" />
            <h:inputText id="autor" value="#{paisController.pais.nome}"/>
          
            <p:commandButton id="inserirPais" update="cars" oncomplete="dialogFichaPais.hide();" actionListener="#{paisController.adicionarPais}" value="Inserir"/>
          </h:panelGrid>

      </p:dialog>
    
    </h:form> 
  </ui:define>
</ui:composition>

Hum, copiei acima, mas é @RequestScoped,

Tenta utilizar o @ViewScoped. Q é meio q um mix de session e request.

Opa, testei com @ViewScoped e deu a mesma coisa.
Agora com @SessionScope funcionou.

Qual a diferença de utilizar o requeste ou o session?

Amigo, me mostra como estais consultando no teu DAO essa lista.

E outra coisa, não é legal buscar no value do dataTable o metodo que vai trazer essa lista.

O bom mesmo é teu datamodel ter um get que éga a lista ja preenchida e naõ executar o metodo do dao nela.

E amigo, posta teu web.xml também. Tenho quase certeza que esse erro é de lá. Pois o certo mesmo pelo que estou vendo é você utilizar o @RequestScope.

Opa darksteel, valeu pela ajuda.
Quanto preencher a lista eu peguei em um exemplo esse jeito.
Eu tenho todos os métodos CRUD e buscas em meus serviços, aí eu te pergunto, o ideal seria chamar direto eles?

    public DataModel getListarPaises() 
    {
      List&lt;Pais&gt; lista = getService().getAll();
      listaPaises = new ListDataModel(lista);
      return listaPaises;
    }

web.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;
        &lt;param-value&gt;Development&lt;/param-value&gt;
    &lt;/context-param&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.xhtml&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;session-config&gt;
        &lt;session-timeout&gt;
            30
        &lt;/session-timeout&gt;
    &lt;/session-config&gt;
    &lt;welcome-file-list&gt;
        &lt;welcome-file&gt;/pages/index.xhtml&lt;/welcome-file&gt;
    &lt;/welcome-file-list&gt;
    

&lt;/web-app&gt;

Não, não é o ideal.

Como havia falado o ideal é você ter um método que carrega essa lista, e fazer um “set” nela, assim quando vc der um get nela, ja vem carregada.

Outra coisa, acho q descobri o problema que estava acontecendo, por isso, vou te pedir pra, voltar a usar o @RequestScope e adicionar isso ao seu web.xml:

&lt;context-param&gt; &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt; &lt;param-value&gt;client&lt;/param-value&gt; &lt;/context-param&gt;

Caso venha a funcionar, te explico o porque do erro !

[quote=darksteel3000]Não, não é o ideal.

Como havia falado o ideal é você ter um método que carrega essa lista, e fazer um “set” nela, assim quando vc der um get nela, ja vem carregada.

Outra coisa, acho q descobri o problema que estava acontecendo, por isso, vou te pedir pra, voltar a usar o @RequestScope e adicionar isso ao seu web.xml:

&lt;context-param&gt; &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt; &lt;param-value&gt;client&lt;/param-value&gt; &lt;/context-param&gt;

Caso venha a funcionar, te explico o porque do erro ![/quote]

É, funcionou mesmo, muito bem, obrigado.
Não entendi porque é melhor eu ter uma lista no controller se eu posso fazer reaproveitamento de código trazer a lista direto por um serviço, assim:

      &lt;p:dataTable id="paises" 
                   var="pais" 
                   value="#{paisController.getService().getAll()}" 
                   rowKey="#{pais.id.codigo}"  
                   selection="#{paisController.getEntity()}" 
                   selectionMode="single" &gt;  

Uma dúvida besta, preciso pausar o servidor de aplicação ( glassfish) , toda hora que altero um .xhtml, .java, contexto do spring ou o web.xml?

Sobre a lista, tenta colocar um metodo pra preenche-la e vc ficar chamando o metodo é melhor. Tipo, ter um metodo montarLista, e dentro de getLista vc chama ele.

Sobre o fato de estar recarregando as coisas:

Tem haver com esse cara:

&lt;context-param&gt;  
        &lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;  
        &lt;param-value&gt;Development&lt;/param-value&gt;  
    &lt;/context-param&gt;  

Tipo, quando vc seta ele como Development, ele deveria estar permitindo vc ficar sem esse lance de recarregar pelo menos com o .xhtml. O resto tem que recarregar mesmo, infelizmente.

Eu utilizo o Tomcat ou JBOSS, e neles o xhtml não precisa ser recarregado, só o resto, como vc usa o glassfish, pode ser isso, não tenho certeza.

Para o parametro Development, pode ser também Production, eu utilizo ele mais, porque, ja vejo como vai ficar no meu cliente, hehe.

Sobre o porque de ter funcionado:

Seguinte, quando vc não seta nada, naquele javax.faces.STATE_SAVING_METHOD -> ele seta por default SERVER, daí, como o teu escopo era de Request, ele ficava se perdendo antes mesmo de completar tua requisição, ja que tudo era alocado no teu lado. Setando ele como CLIENT, as coisas ficam alocadas no lado oposto, e por isso ele consegue manter a sessão estável por mais tempo.

[quote=darksteel3000]Sobre a lista, tenta colocar um metodo pra preenche-la e vc ficar chamando o metodo é melhor. Tipo, ter um metodo montarLista, e dentro de getLista vc chama ele.

Sobre o fato de estar recarregando as coisas:

Tem haver com esse cara:

&lt;context-param&gt;  
        &lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;  
        &lt;param-value&gt;Development&lt;/param-value&gt;  
    &lt;/context-param&gt;  

Tipo, quando vc seta ele como Development, ele deveria estar permitindo vc ficar sem esse lance de recarregar pelo menos com o .xhtml. O resto tem que recarregar mesmo, infelizmente.

Eu utilizo o Tomcat ou JBOSS, e neles o xhtml não precisa ser recarregado, só o resto, como vc usa o glassfish, pode ser isso, não tenho certeza.

Para o parametro Development, pode ser também Production, eu utilizo ele mais, porque, ja vejo como vai ficar no meu cliente, hehe.

Sobre o porque de ter funcionado:

Seguinte, quando vc não seta nada, naquele javax.faces.STATE_SAVING_METHOD -> ele seta por default SERVER, daí, como o teu escopo era de Request, ele ficava se perdendo antes mesmo de completar tua requisição, ja que tudo era alocado no teu lado. Setando ele como CLIENT, as coisas ficam alocadas no lado oposto, e por isso ele consegue manter a sessão estável por mais tempo.[/quote]

Bem complexo, pelo que eu pesquisei isso acontece no mojarra 2.1.7 para baixo, a partir da versão 2.1.8 isso não deve mais acontecer, o problema é que o glassfish vem com a versão 2.1.6. Até tentei mudar, só que sem sucesso.
Vou seguir adiante então com essa solução, obrigado amigo.

[quote=darksteel3000]Sobre a lista, tenta colocar um metodo pra preenche-la e vc ficar chamando o metodo é melhor. Tipo, ter um metodo montarLista, e dentro de getLista vc chama ele.

Sobre o fato de estar recarregando as coisas:

Tem haver com esse cara:

&lt;context-param&gt;  
        &lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;  
        &lt;param-value&gt;Development&lt;/param-value&gt;  
    &lt;/context-param&gt;  

Tipo, quando vc seta ele como Development, ele deveria estar permitindo vc ficar sem esse lance de recarregar pelo menos com o .xhtml. O resto tem que recarregar mesmo, infelizmente.

Eu utilizo o Tomcat ou JBOSS, e neles o xhtml não precisa ser recarregado, só o resto, como vc usa o glassfish, pode ser isso, não tenho certeza.

Para o parametro Development, pode ser também Production, eu utilizo ele mais, porque, ja vejo como vai ficar no meu cliente, hehe.

Sobre o porque de ter funcionado:

Seguinte, quando vc não seta nada, naquele javax.faces.STATE_SAVING_METHOD -> ele seta por default SERVER, daí, como o teu escopo era de Request, ele ficava se perdendo antes mesmo de completar tua requisição, ja que tudo era alocado no teu lado. Setando ele como CLIENT, as coisas ficam alocadas no lado oposto, e por isso ele consegue manter a sessão estável por mais tempo.[/quote]

darksteel, se aproveitando de sua experiência.

Fiquei um pouco intrigado com a crítica sobre meu dataTable.
Não que eu ache que ele está certo, mas qual seria a melhor maneira de eu trabalhar o meu CRUD no MB?

Vamos lá.

Quando desenvolvo sistemas, tanto na empresa quanto proprios, utilizo Um ManagedBean para cada Entidade. Então pode ter até mais que um CRUD nela. Não é legal ficar fazendo um MB para cada operação ou ficar dividindo, só faça isso se realmente for necessário.

Sobre o seu datatable, não é que você está fazendo de maneira certa ou errada. ele está certo, o problema é que recomendações de uso, avisam para agente não ter o metodo do DAO ou Service, dentro do get do datatable, e sim uma chamada ao metodo que chamará o DAO ou Service.

Outra coisa, não sei se é o seu caso, mas você realmente precisa carregar seu dataTable com um DataModel ? Se sim, beleza, senão, podes utilizar uma collection ou list pra isso.

Eu mesmo, só não utilizo um list, quando preciso fazer o famoso carregamento LAZY, onde devemos utilizar o LAZYDataModel do prorpio primefaces, para ele controlar o carregamento sobre demanda.

Tem exemplo disso no proprio site do Primefaces.

Indo para as outras operações:

como havia dado a dica acima, um MB para cada entidade já é o suficiente, só utilize mais se realmente for o caso, como por exemplo, no teu MB de Login, eu mesmo aqui, tenho um MB so pra Login e logout, onde a entidade principal é o usuário e o escopo dele é @SessionScoped. Já o meu MB de usuario, tenho as minhas operações de consulta de usuario, inclusao, deleção, etc… e ele tem o escopo de @ResquestScoped. Deu pra entender?

[quote=darksteel3000]Vamos lá.

Quando desenvolvo sistemas, tanto na empresa quanto proprios, utilizo Um ManagedBean para cada Entidade. Então pode ter até mais que um CRUD nela. Não é legal ficar fazendo um MB para cada operação ou ficar dividindo, só faça isso se realmente for necessário.

Sobre o seu datatable, não é que você está fazendo de maneira certa ou errada. ele está certo, o problema é que recomendações de uso, avisam para agente não ter o metodo do DAO ou Service, dentro do get do datatable, e sim uma chamada ao metodo que chamará o DAO ou Service.

Outra coisa, não sei se é o seu caso, mas você realmente precisa carregar seu dataTable com um DataModel ? Se sim, beleza, senão, podes utilizar uma collection ou list pra isso.

Eu mesmo, só não utilizo um list, quando preciso fazer o famoso carregamento LAZY, onde devemos utilizar o LAZYDataModel do prorpio primefaces, para ele controlar o carregamento sobre demanda.

Tem exemplo disso no proprio site do Primefaces.

Indo para as outras operações:

como havia dado a dica acima, um MB para cada entidade já é o suficiente, só utilize mais se realmente for o caso, como por exemplo, no teu MB de Login, eu mesmo aqui, tenho um MB so pra Login e logout, onde a entidade principal é o usuário e o escopo dele é @SessionScoped. Já o meu MB de usuario, tenho as minhas operações de consulta de usuario, inclusao, deleção, etc… e ele tem o escopo de @ResquestScoped. Deu pra entender?

[/quote]

Certo, mudei meu controller e meu xhtml, veja como ficou, está no caminho certo?
MB

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


@ManagedBean
@RequestScoped
public class PaisController extends ControllerAbstract&lt;Pais,PaisService&gt;
{
  private Pais pais = new Pais();
  private List&lt;Pais&gt; paises = new ArrayList&lt;Pais&gt;();
  
  public void lista() 
  {
    paises = getService().getAll();
  } 
  
  private void limpa() 
  {
    pais = new Pais();
  }
  
  public void preparaParaAdicionar() 
  {
    limpa();
  }
  
  public void adiciona() 
  {
    getService().insert(pais);
    lista();
  } 
  
  public void remove() 
  {
    getService().remove(pais);
    lista();
  }
  
  public void preparaParaAlterar() 
  {
    this.pais = getService().findById(pais.getId(),true);
  } 
  
  public void altera() 
  {
    getService().update(pais);
  }
  
  /*-------------------------------------------------------------------
  *		            GETTERS AND SETTERS
  *-------------------------------------------------------------------*/

  public Pais getPais()
  {
    return pais;
  }

  public void setPais(Pais pais)
  {
    this.pais = pais;
  }

  public List&lt;Pais&gt; getPaises()
  {
    return paises;
  }

  public void setPaises(List&lt;Pais&gt; paises)
  {
    this.paises = paises;
  }
  
  
}

XHTML

&lt;ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    template="/resources/theme/template.xhtml"&gt;
        
  &lt;ui:define name="centro"&gt;
    &lt;h:form id="form"&gt;  
      
          
      &lt;!-- ******************************Lista****************************** --&gt;
      &lt;p:dataTable id="tabelaPaises" 
                   var="pais" 
                   value="#{paisController.paises}" 
                   rowKey="#{pais.id.codigo}"&gt;  
        
        &lt;f:facet name="header"&gt;
          &lt;p:splitButton value="Novo"  oncomplete="dialogFichaPais.show()" icon="ui-icon-document"&gt;  
            &lt;p:menuitem value="Editar" icon="ui-icon-arrowrefresh-1-w"/&gt;  
            &lt;p:menuitem value="Apagar" ajax="false" icon="ui-icon-close"/&gt;  
          &lt;/p:splitButton&gt;
          
          &lt;h:commandButton value="Listar" action="#{paisController.lista}" /&gt;
        &lt;/f:facet&gt; 
        
        &lt;p:column headerText="Código"&gt; #{pais.id.codigo} &lt;/p:column&gt;  
        &lt;p:column headerText="Nome"&gt; #{pais.nome} &lt;/p:column&gt;  
              
      &lt;/p:dataTable&gt;  
  
      &lt;!-- ******************************Ficha****************************** --&gt;

      &lt;p:dialog header="Gerencia Países" 
                widgetVar="dialogFichaPais"  
                resizable="false" 
                modal="true" 
                width="300" 
                appendToBody="true"
                id="dialogFichaPaisTeste"
                &gt;
        

          
          &lt;h:panelGrid id="infosLivro" columns="2" style="margin-bottom:10px"&gt;
            
            &lt;h:outputLabel for="codigo" value="Código:" /&gt;
            &lt;h:inputText id="codigo" value="#{paisController.pais.id.codigo}"/&gt;
 
            &lt;h:outputLabel for="filial" value="Filial:" /&gt;
            &lt;h:inputText id="filial" value="#{paisController.pais.id.filial.id.codigo}"/&gt;
            
            &lt;h:outputLabel for="nome" value="Nome:" /&gt;
            &lt;h:inputText id="nome" value="#{paisController.pais.nome}"/&gt;
          
            &lt;p:commandButton id="inserirPais" 
                             update="tabelaPaises" 
                             oncomplete="dialogFichaPais.hide();" 
                             actionListener="#{paisController.adiciona}" 
                             value="Inserir"
                             /&gt;
          &lt;/h:panelGrid&gt;

      &lt;/p:dialog&gt;
    
    &lt;/h:form&gt; 
  &lt;/ui:define&gt;
&lt;/ui:composition&gt;

Muito bom cara, eu ia até te dar essa dica de ter sempre um botão pra listar pra vc hehe, muito boa ideia. Ta mais do que no caminho certo !!!

Qualquer coisa dá um toque !

[quote=darksteel3000]Muito bom cara, eu ia até te dar essa dica de ter sempre um botão pra listar pra vc hehe, muito boa ideia. Ta mais do que no caminho certo !!!

Qualquer coisa dá um toque ![/quote]

Opa, legal que curtiu darksteel.
Fiquei com peso na consciência depois que tu comentou aquilo e dei uma estudada melhor nessa parte, realmente achei que ficou melhor assim. Agora outra coisa que está me perturbando, um xhtml é o suficiente para CRUD básico ou crio um com as listas, e dentro de um dialog por exemplo chamo outro. Pergunta besta, só que encontrei das autores que fazem das duas formas.

Nesse meu exemplo eu faço tudo em um xhtml, pra mim quanto menos melhor.

Abraço