Conversation Scope - Conversação não permanece

1 resposta
fillipe.soares

Olá a todos!

Estou com um problema em trabalhar com um Managed Bean configurado em @ConversationScoped. Eu inicio uma conversação num metodo set de um atributo do meu bean (atributo tarefa), mas no segundo request que eu faço (chamada do metodo salvar), o objeto tarefa é um novo objeto e o status da conversação está transiente, mesmo sem eu tê-la finalizado.
O primeiro request é chamado de um link em uma coluna de um dataTable de tarefas, correspondente ao nome do colaborador responsavel por aquela tarefa.
O segundo request é feito através de um a4j:commandButton dentro de um popup do richfaces.

Alguém saberia me dizer o que pode estar acontecendo com o escopo?

Obrigado!

------------ MANAGED BEAN -----------------

@Named
@ConversationScoped
public class TarefaController implements Serializable {

    private Tarefa tarefa;
    private List<Colaborador> colaboradores;

    @Inject
    private Conversation conversation;

    //outros atributos

    public void setTarefa(Tarefa tarefa) {        
        conversation.begin();
        this.tarefa = tarefa;
    }

    public String salvar() {
            //
            //Salva ou faz update de tarefa no banco
            //

            if (!conversation.isTransient()) {
                conversation.end();
            }

            return "listaTarefas";

        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    //entre outros metodos
}

--------------- Campo que faz o primeiro request setando o atributo do bean com a tarefa a ser alterada ---------------

<rich:column>
                        <f:facet name="header"> 
                            <h:outputText value="Colaborador"/>
                        </f:facet>
                        <h:outputText value="#{tarefas.colaborador.nome}" rendered="#{not empty tarefas.colaborador}"/>                            
                        <a4j:commandLink id="adicionaColaborador" rendered="#{empty tarefas.colaborador}" value="Adicionar Colaborador" oncomplete="#{rich:component('popupColaboradores')}.show()" render="popup">
                            <f:setPropertyActionListener target="#{tarefaController.tarefa}" value="#{tarefas}"/>
                        </a4j:commandLink>
</rich:column>

-------------- Popup do XHTML ---------------

<rich:popupPanel id="popupColaboradores" resizeable="true" height="100" width="350" domElementAttachment="form">
                
                <f:facet name="header">
                    <h:outputText value="Selecione o colaborador"/>
                </f:facet>
                <f:facet name="controls">
                    <h:outputLink value="#"
                                  onclick="#{rich:component('popupColaboradores')}.hide(); return false;">
                        X
                    </h:outputLink>
                </f:facet>  
                <h:panelGrid columns="2">
                    <h:outputText value="Colaboradores:"/>
                    <rich:select id="cbbPopupColaboradores" value="#{tarefaController.tarefa.colaborador}" converter="#{colaboradorConverter}">
                        <f:selectItems value="#{tarefaController.colaboradores}" var="colaborador" itemLabel="#{colaborador.nome}" itemValue="#{colaborador.nome}"/>
                    </rich:select>      
                    <br/>
                    <br/>
                    <center>
                        <a4j:commandButton value="Adicionar" render="panel" action="#{tarefaController.salvar}" execute="cbbPopupColaboradores" onclick="#{rich:component('popupColaboradores')}.hide();"/>                        
                    </center>
                </h:panelGrid>
            </rich:popupPanel>

1 Resposta

fillipe.soares

Consegui dar um passo!

Eu inseri dentro do meu commandButton um parametro:

<rich:popupPanel id="popupColaboradores" resizeable="true" height="100" width="350" domElementAttachment="form">
                
                <f:facet name="header">
                    <h:outputText value="Selecione o colaborador"/>
                </f:facet>
                <f:facet name="controls">
                    <h:outputLink value="#"
                                  onclick="#{rich:component('popupColaboradores')}.hide();">
                        X
                    </h:outputLink>
                </f:facet>  
                <h:panelGrid columns="2">
                    <h:outputText value="Colaboradores:"/>
                    <rich:select id="cbbPopupColaboradores" value="#{tarefaController.tarefa.colaborador}" converter="#{colaboradorConverter}">
                        <f:selectItems value="#{tarefaController.colaboradores}" var="colaborador" itemLabel="#{colaborador.nome}" itemValue="#{colaborador.nome}"/>
                    </rich:select> 
                    <h:outputLabel value="#{tarefaController.conversation.id}"/>
                    <br/>
                    <br/>
                    <center>
                        <a4j:commandButton value="Adicionar" render="panel" action="#{tarefaController.salvar}" execute="cbbPopupColaboradores" onclick="#{rich:component('popupColaboradores')}.hide();">
                            <f:param name="cid" value="#{tarefaController.conversation.id}"/>
                        </a4j:commandButton>
                    </center>
                </h:panelGrid>
            </rich:popupPanel>

Então passou a dar um outro erro:

EVERE: org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 
	at org.jboss.weld.jsf.WeldPhaseListener.activateConversations(WeldPhaseListener.java:108)
	at org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:84)
	at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99)
	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
	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 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	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)

Alguém entende? Sabe qual o caminho da solução?

Criado 25 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 1
Participantes 1