Como uso o @ ConversationScoped
Estou escrevendo um aplicativo JSF 2.0 e quero usar anotações CDI em vez das anotações JSF "equivalentes". Em outras palavras, @Model ou @Named em vez de @ManagedBean e @Inject em vez de @ ManagedProperty.
A única coisa que não consigo trabalhar é o @ViewScoped, necessário para os componentes AJAX. A única solução alternativa confiável é usar o @SessionScoped, o que não é uma boa prática.
Qual é a prática correta? Por mais que eu procure, fico mais confuso.
Este é o GlassFish 3.1.1, que eu entendo possui o Weld 1.1.
UPDATE: A forma original desta pergunta dizia que não conseguia que o @ConversationScoped funcionasse. Desde então, encontrei o meu erro e o fiz funcionar da seguinte maneira:
@Model
@ConversationScoped
public class Abean implements Serializable {
@Inject Conversation conversation;
// stuff omitted for brevity
public String getSomething() {
if (conversation.isTransient()) conversation.begin();
return "something";
}
Isso parece fazer o truque. No entanto, agora minha pergunta foi alterada. Para onde exatamente você deveria ligar para conversação.end ()? Preciso escrever um filtro para detectar quando o usuário sai da página? Ou, se for deixado sozinho, quando o Abean instância ser de-referenciada?
EGUNDA ATUALIZAÇÃO: Uma discussão muito boa sobre o @ConversationScoped da CDI que encontreiaqui
Ainda me resta o problema de como ligar para o serviço conversion.end (). Meu bean fornece suporte estatal a um navegador de tabela de dados atualizado via AJAX, e o local ideal para chamar end () é quando o usuário navega para fora da página. Por menos que escreva um filtro para monitorar as páginas, não vejo realmente nenhuma maneira de fazer isso. Qualquer sugestão de "prática recomendada" é bem-vind