CDI - Compartilhar um objeto instânciado

4 respostas
W

Boa tarde,

Estou utilizando JEE6 e CDI (JSR 299) + Glassfish v3 e gostaria de saber se após criar um objeto de sessão utilizando @Inject consigo recuperar esse mesmo objeto em outro momento na aplicação utilizando novamente @Inject, bom vou tentar explicar melhor:

Eu possuo um managed bean chamado FiltroMBean onde injeto um objeto com escopo de sessão (FiltroGlobal) e eu gostaria que esse objeto fosse compartilhado com outras classes que utilizarem @Inject FiltroGlobal. Pelo que pude perceber, cada vez que eu faço @Inject FiltroGlobal o container instância um novo FiltroGlobal.
Resumindo, tem como eu injetar essa classe (@Inject FiltroGlobal) uma vez e nas próximas vezes que eu necessitar injetar a mesma que ela já venha populada com os valores que setei anteriormente?

Essa é a classe a ser injetada

@SessionScoped
public class FiltroGlobal extends Filtro implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private Uf uf = new Uf();
.....
}

Aqui eu injeto pela primeira vez e seto os valores para o filtro global que devem ser utilizados por todo o sistema.

@Named("filtroMBean")
@SessionScoped
public class FiltroMBean implements Serializable {

	private @Inject FiltroGlobal filtroGlobalSelecionado;
.....
}

Posteriormente eu gostaria de injetar esse objeto filtro global com os valores selecionados anteriormente e não que um novo objeto seja instânciado.

public class PlanejamentoRepository implements Serializable {

        private @Inject FiltroGlobal filtroGlobal;
	private @Inject EntityManager em;
......
}

Existe alguma maneira de fazer isso?
Até o momento sempre que utilizo @Inject uma novo objeto é criado.

Obrigado!

4 Respostas

G

Se o objeto é session-scope, o ciclo de vida é a session do usuário. Ou seja, se a session ainda não acabou você deveria ter seu componente lá com o estado anterior.

Você importou o pacote correto para o SessionScope? Está usando @Named (não lembro se é mandatory no CDI/Weld, no Seam sei que é)?

W

Oi Garcia,

Estou utilizando @Named sim e o import segue abaixo:

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

O comportamento adequado do CDI seria injetar o objeto que já está na sessão ao invés de instânciar um novo, correto?
Eu tive o cuidado de importar a Session do pacote javax.entreprise.context e mesmo assim nada.

Obrigado.

G

Deveria funcionar assim.

Notei que FiltroGlobal (que é session) estende Filtro. A classe filtro possui algum escopo? Faça um teste usando FiltroGlobal sem herança alguma. Não lembro agora de cabeça como fica o escopo no caso de herança.

Dependendo do caso talvez seja melhor até você usar composição ao invés de herança. Ou seja, ao invés de você ser um Filtro, você possui um Filtro.

W

Obrigado, garcia-jj.

Percebi que ao utilizar o filtroGlobal em outras classes do sistema a injeção ocorreu perfeitamente.
O problema é que a classe que eu preciso injetar não é gerenciada pelo CDI, para esse caso especifico eu estava tentando injetar a classe FiltroGlobal dentro de FacesConverter.
A solução foi utilizar o BeanManager conforme descrito nesse blog --> http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/

Obrigado pela ajuda!

Criado 7 de fevereiro de 2011
Ultima resposta 7 de fev. de 2011
Respostas 4
Participantes 2