CDI ausente @ViewScoped e @FlashScoped

Por que o Java EE 6 CDI está faltando as annotations @ViewScoped e @FlashScoped? (especialmente o primeiro me faz pensar, porque o CDI vem do mundo do Seam, que já conhecia o ScopeType.PAGE …)

Quais são as soluções recomendadas ao usar o CDI? Use Seam 3?

obrigado

O @ViewScoped é específico para o framework JSF do MVC, não para o CDI da estrutura de injeção de dependência. O escopo da exibição permanece contanto que você esteja interagindo com a mesma visualização do JSF. O CDI não tem realmente uma noção de “visualizações”. A alternativa do CDI para isso é @ConversationScoped que é mais longa que o escopo da solicitação, mas menor que o escopo da session. Você só precisa controlar a rescisão por conta própria. Você pode, se necessário, usar o MyFaces CODI para fazer a ponte entre os @ViewScoped JSF @ViewScoped e CDI @Named . O próximo JSF 2.2 terá um @ViewScoped compatível com CDI no pacote javax.faces.view .

O @FlashScoped não existe no JSF. O escopo flash do JSF existe basicamente de um mapa que é apoiado por um cookie short-living que sobrevive a redirecionamentos HTTP. Você não pode deixar o JSF colocar beans gerenciados neste escopo. Você tem que colocar manualmente / obter os valores no / do mapa você mesmo e / ou usar a referência #{flash} em EL, que basicamente refina o mapa. No entanto, o Seam Faces sequestrou o pacote javax.faces.bean específico do JSF para sua anotação @FlashScoped , mas isso definitivamente não é da API JSF padrão.

Veja também:

  • Adicionar itens à lista em Request Scoped Bean – contém alguns exemplos concretos de alternativas de CDI

Você pode implementar o contexto e usar o @NormalScope para criar seu próprio escopo de CDI usando qualquer outro framework ou esperando pelo novo JEE7.

  • CDI triggers um evento AfterBeanDiscovery após cada chamada de bean
  • Você pode usar a extensão CDI para @Observes este evento e adicionar sua implementação de contexto
  • Na sua implementação de escopo você pode:
    1. Use o Contextual para obter o seu bean pelo seu nome no FacesContext ViewRoot Map e retorná-lo após cada chamada do ajax
    2. Use CreationalContext se o nome do bean do primeiro passo não for encontrado para criá-lo no Mapa do FacesContext ViewRoot

para uma explicação mais detalhada, eu recomendo este link: http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/