Menu

quarta-feira, 25 de abril de 2012

Uso de @ViewScoped no CDI em projetos EE sem Maven

Uma das primeiras dificuldades de quem começa com CDI após ter utilizado o JSF 2 é a falta da anotação @ViewScoped, que permite que o escopo do bean seja mantido enquanto o usuário permanecer na mesma página.

A solução recomendada para contornar este problema é adicionar a biblioteca seam-faces em seu projeto. Esta biblioteca possui a implementação do escopo de view.

Entretanto não é assim tão simples quanto parece. Para utilizar os componentes do JBoss Seam é geralmente necessário utilizar Maven para gerenciar seu projeto, pois a biblioteca seam-faces possui outras bibliotecas como dependências (seam-solder e seam-international). Nem sempre isso é possível, além de adicionar uma nova tecnologia para a fila daquelas que você precisa aprender na linguagem Java.

Primeiramente é necessário baixar o seam-bundle, que inclui todas as libs do seam em um único arquivo compactado. O seam-bundle na versão 3.1 pode ser encontrado aqui.

Após baixar o seam-3.1.0.Final.zip, extraia seu conteúdo para qualquer diretório. As bibliotecas necessárias serão todas encontradas na pasta artifacts

Em projetos enterprise, adicionar o seam-faces não se resumirá a colocar todas as bibliotecas em um único local, algumas ficam no projeto enterprise e outras no projeto web. Abaixo está a estrutura do meu projeto, que consiste em um projeto enterprise, um projeto web e diversos projetos EJBs (que não listei já que não são necessários para esta configuração).


  • Projeto Enterprise
    • EarContent
      • lib
        • solder-api.jar
        • solder-impl.jar
        • solder-logging.jar
  • Projeto Web
    • WebContent
      • WEB-INF
        • lib
          • seam-faces.jar
          • seam-faces-api.jar
          • seam-international.jar
          • seam-international-api.jar

Quando houver apenas o projeto Web, acredito que seja necessário apenas colocar as bibliotecas do seam-solder também em WEB-INF/lib.

Ressaltando que meu servidor de aplicação é o JBoss AS 7, talvez em outros servidores a configuração seja diferente.

7 comentários :

  1. Humberto, eu utilizo Maven, Seam 3, Seam Faces. Tento utilizar a anotação @ViewScope e acontece o seguinte erro: Caused by: java.io.NotSerializableException: org.jboss.weld.bean.ManagedBean

    Tem ideia do que seja?

    Abraços

    ResponderExcluir
    Respostas
    1. Sam, você está implementando a interface Serializable no seu bean?

      Excluir
    2. Estou sim, segue o meu bean

      import java.io.Serializable;

      import javax.faces.bean.ViewScoped;
      import javax.inject.Named;

      @ViewScoped
      @Named
      public class TesteBean implements Serializable {

      public TesteBean() {}

      private static final long serialVersionUID = 1L;

      private String teste;

      public String getTeste() {
      return teste;
      }

      public void setTeste(String teste) {
      this.teste = teste;
      }
      }

      Excluir
    3. Preste atenção no @ViewScoped que você está utilizando (javax.faces). Esse é o do JSF, que vc ñ pode misturar com o CDI.
      Você precisa utilizar o ViewScoped implementado pelo Seam 3 (na biblioteca seam-faces).

      Excluir
    4. Mas na própria documentação (http://docs.jboss.org/seam/3/faces/latest/reference/en-US/html/scopes.html#viewscoped) fala para usar do javax.faces (To scope a bean to the View, use the @javax.faces.bean.ViewScoped annotation)...

      Como utilizar a implementação do Seam 3 então?

      Excluir
    5. Você está correto. Eu estava no meio de uma aula e me equivoquei na resposta. Pelo que pesquisei, isso aparentemente é um bug do Seam.

      Você poderia me informar qual a versão e as dependências do Seam que você está utilizando? (de preferência o pom.xml do maven).

      Excluir
    6. Humberto, já vi qual era meu problema, estava usando o STATE_SAVING_METHOD como client, e o viewScope só funciona se for server.

      Abraços!!

      Excluir