Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Atualizar dados em RequestScoped

Olá para todos!

Tenho o seguinte problema: possuo uma view com uma p:dataTable, que apresenta algumas linhas de dados advindos do meu banco, através de uma lista. Estou utilizando essa view em RequestScoped pelo fato dessa lista possuir um p:commandLink, cuja action é um redirect para outra view, com um f:param do ID da bean da linha clicada. Eu estou conseguindo levar o conteúdo de uma view para outra sem problemas por enquanto, através desse f:param.

O problema é que nessa list eu também tenho um p:commandButton para alterar os dados da linha, que carrega na bean da view, jogando numa outra form esses dados. Quando faço qualquer alteração e clico para gravar, logicamente, por estar em RequestScoped, ele salva como um novo objeto no banco, já que ele gerou outra requisição e perdeu a bean antiga.

Minha dúvida é: como contornar esse problema sendo que preciso manter o RequestScoped nessa view para poder utilizar o f:param (caso utilize @ViewScoped ou @SessionScoped, ele me retorna aquele erro que o escopo da referência é menor que o da view)?

EDIT:

Pesquisando um pouco melhor, verifiquei uma questão que todos que estavam com dúvidas similares a minha, possuíam: eu estou usando o mesmo Bean (ProjetoBean) para manipular tanto os projetos de uma view, quanto para enviá-los como parâmetro de um request para outra, em RequestScoped. Será que a solução portanto seria criar uma classe Bean "auxiliar" para tratar destes parâmetros, algo como "ProjetoIdBean" que manipularia as requests da view anterior, e sendo RequestScoped?

4 respostas

nao estou certo que entendi o problema, mas vou chutar do mesmo jeito. Ser requestscoped nao eh tao problematico... se vc submeteu um form, o proprio jsf ja cuida de manter o estado para vc... se vc quer recriar a arvore do zero, vc pode dar um redirect para o proprio xhtml que gerou a requisicao. Desse jeito o jsf gera tudo de novo.

Então, o bean se perde com uma nova requisição, então não consigo gravar a alteração em algum dado do banco pelo sistema, por exemplo. Até mesmo sendo Ajax, essa nova requisição mata o Bean.

Estava me referindo depois em deixar tudo em ViewScoped ou até SessionScoped, mas criando uma nova classe Bean para a outra view, delegando a responsabilidade de listar os projetos para um, e de mostrar os projetos com o restante dos dados para outro bean. O que você acha dessa abordagem?

solução!

Oi Felipe, eu ainda acho que ser requestscoped nao eh problema... quando vc fizer o post, o jsf vai instanciar o bean e popular com as informacoes da arvore.. mas se vc quiser ir por esse outro approach, acho que vale tambem. Jsf, de vez em quando, nos obriga a usar de solucoes nao bacanas.

Então, o meu problema era no Update do CRUD, que por ele ser RequestScoped, no momento de gravar bean carregado, ele criava um novo, e então um novo registro no banco, entende?

Fiz da seguinte forma: utilizei como SessionScoped o mesmo Bean (nem criei outro), e quando clicado no link para levar esse bean para outra página (página de despesas do projeto), fiz:

    public String carregarDespesas(Projeto projeto){
        this.projeto = projeto;
        return "despesa?faces-redirect=true";
    }

E no p:dataTable:

<p:dataTable value="#{projetoBean.projetosAtivos}" var="projeto"
                id="tabelaProjetos" paginator="true" rows="10">

                <f:facet name="header">Projetos</f:facet>

                <p:column headerText="Título" sortBy="#{projeto.nome}"
                    filterBy="#{projeto.nome}" filterMatchMode="startsWith">
                    <p:commandLink value="#{projeto.nome}" action="#{projetoBean.carregarDespesas(projeto)}">
                    </p:commandLink>
                </p:column>

...
</p:dataTable>