JSF PrimeFaces Ajax: É necessário que o mbean esteja no escopo de sessão?

Pessoal,

Sobre o Ajax usado no PrimeFaces, uma dúvida conceitual:
É necessário que o mbean seja do escopo de sessão (ou aplicação)?

Digo isso porque, em meu caso, para cada chamada ajax está sendo criada uma nova instância do mbean.

No exemplo do Collector não diz em que escopo está o mbean “CreateBookBean”:
http://www.primefaces.org/showcase/ui/collector.jsf

Alguma idéia?

Voce ta usando algum framework tipo o Seam ou ta usando JSF2,CDI?

O escopo de Request realmente ira acontecer isso vc tera que usar ou Page, ViewScoped,Session,Conversation

vai depender do q vc ta usando

Request cada requisição independente se é ajax ou nao ele gera uma nova instancia

O ideal seria utilizar o ViewScoped, caso esteja utilizando JSF2.0.

Caso esteja utlizando JSF 1.2, você pode utilizar o pacote MyFaces Tomahawk com o seu KeepAlive.

Dessa forma quando você fizer uma requisição Ajax, o estado da MB será mantido.

[quote=barbon]O ideal seria utilizar o ViewScoped, caso esteja utilizando JSF2.0.

Caso esteja utlizando JSF 1.0, você pode utilizar o pacote MyFaces Tomahawk com o seu KeepAlive.

Dessa forma quando você fizer uma requisição Ajax, o estado da MB será mantido.[/quote]

Considero que se voce estiver utilizando JSF1.2 e melhor dar uma olhada no Seam do que utilizar Tomahawk só por causa do KeepAlive.

Então,

Estou usando JSF 2.0 e PrimeFaces, nenhum framework.
Mas da próxima vez dou uma olhada no Seam, agora preciso resolver assim porque já estou no final.

Sobre o escopo do mbean, tentei usar o ViewScope, mas no meu caso não foi possível, possivelmente por limitação na estruturação dos meus mbeans. Vejam:

  • O Ajax seria necessário na tela de entrada em estoque (estoque.xhtml, contendo o mbean EntradaEstoqueMB).
  • Para gravar uma entrada é necessário selecionar um fornecedor (FornecedorMB, também usado no cadastro de fornecedores, com RequestScope).
  • Além disso é necessário selecionar vários produtos para essa mesma entrada (ProdutoMB, também usado no cadastro de produtos, portanto com RequestScope).
  • Neste caso, o mbean EntradaEstoqueMB possui um mbean FornecedorMB e um List, pois é assim que deve ser gravado na base.

Sendo assim, não posso usar nenhum escopo maior que RequestScope em EntradaEstoqueMB, por causa dos outros mbeans.

Então mais uma vez tenho uma dúvida conceitual:
Deveria eu usar os mbeans desta forma? Ou teria outra forma melhor?

Agradeço desde já pelas respostas.

No seu caso ao meu ver seria melhor EntradaEstoqueMB ser ViewScope
e ele ter um atributo FornecedorMB e um List ProdutoMB

como esses objetos estaria dentro do EntradaEstoqueMB e seriam instanciado pelo objeto EntradaEstoqueMB não teria pq SessionScope
ate pq se voce colocar todo mundo com SessionScope se usuario selecionar um fornecedor na estoque.xhtml e acessar a pagina do cadastro do fornecedor antes de gravar essa entrada esse fornecedor estara selecionado

Então leonardobhbr,

É isso que eu penso também.
Mas colocar EntradaEstoqueMB como ViewScope não dá, porque FornecedorMB e ProdutoMB são RequestScope, isso dá erro.

Então por enquanto ainda não tenho uma solução conceitual do que deveria se feito neste caso.

No blog do Rafael Pontes fala sobre “Um ou Vários MBeans?” (http://www.rponte.com.br/tag/boaspraticas/), onde a princípio ele defende que deve ter um único mbean para cada página. Mas o que fazer neste meu exemplo, duplicar as informações contidas em FornecedorMB e ProdutoMB? Acho que não.

Significa o que esta dando erro de compilação? em tempo de execução ? tem como postar o codigo das classes e o stackTrace ?

Segue o erro ocorrido ao colocar EntradaEstoqueMB como ViewScope…

GRAVE: O JSF estará indisponível para criar o bean gerenciado mbEntradaEstoque quando ele for solicitado.  Os seguintes problemas foram encontrados:
     - O escopo do objeto referido pela expressão #{mbFornecedor}, request, é menor do que o escopo do bean gerenciado referido (mbEntradaEstoque) de view

… por isso não consigo aumentar o escopo de EntradaEstoqueMB, já que FornecedorMB deve ficar como RequestScope.

Alguma idéia?

Consegui resolver!!

  • Coloquei o EntradaEstoqueMB como ViewScope.
  • Mas para isso tive que retirar FornecedorMB e List do mbean EntradaEstoqueMB.
  • No lugar de FornecedorMB, coloquei só o idFornecedor.
  • E no lugar de List, coloquei List.

Aí o Ajax funcionou blz!!

Obrigado a todos pela atenção.

Pessoal estou construindo uma aplicação onde tenho um template full page e no top desse layout tenho um menubar. Quero quando acionar o menuitem (ajax) o meu contener central atualize (apenas ele). Teria como alguém me ajudar? Exemplos? Grato pela atenção de todos.