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.
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
ResponderExcluirTem ideia do que seja?
Abraços
Sam, você está implementando a interface Serializable no seu bean?
ExcluirEstou sim, segue o meu bean
Excluirimport 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;
}
}
Preste atenção no @ViewScoped que você está utilizando (javax.faces). Esse é o do JSF, que vc ñ pode misturar com o CDI.
ExcluirVocê precisa utilizar o ViewScoped implementado pelo Seam 3 (na biblioteca seam-faces).
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)...
ExcluirComo utilizar a implementação do Seam 3 então?
Você está correto. Eu estava no meio de uma aula e me equivoquei na resposta. Pelo que pesquisei, isso aparentemente é um bug do Seam.
ExcluirVocê 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).
Humberto, já vi qual era meu problema, estava usando o STATE_SAVING_METHOD como client, e o viewScope só funciona se for server.
ExcluirAbraços!!