EJB - dados contextuais

3 respostas
jrdalpra

Pessoal,

estou tentando achar uma forma de passar dados "contextuais" para um EJB. Seria mais ou menos assim:

- O usuário do sistema faz o login e neste momento seleciona algumas informações - empresa, filial, etc.

Quero utilizar estas informações dentro dos meus EJBs (EJB 3.1), porém não quero ter que refatorar todas as assinaturas e chamadas de métodos. 

Gostaria de passar essas informações no contexto da chamada e depois poder utilizar elas dentro dos EJBs. Veja o pseudo codigo:
/** criado quando o usuario faz login */
	public class ContextoDeSessaoDoUsuario {
		private Usuario atual;
		private Empresa empresa;
		// getters e setters
	}
	
	
	/** controlador JSF */
	@ManagedBean // at web tier
	public class ListPessoasController {
		
		@EJB
		PessoasRepository pessoas; // some remote interface
		
		// getters / setters
		private String nome; // preenchido na interface com o usuario
		
		/** utilizado em um componente datatable qualquer */
		public List<Pessoa> listaTodos(){
			return pessoas.listaTodosComNomeOuRazaoSocial(nome); // Aqui nao vou passar os dados do contexto
		}
		
	}
	
	/** EJB que vai precisar do contexto */
	@Stateless
	public PessoasEJB implements PessoasRepository {
		
		@Inject 
		ContextoDeSessaoDoUsuario contexto; // injetado antes da chamada, por uma factory qualquer do CDI
		
		public List<Pessoa> listaTodosComNomeOuRazaoSocial(String nomeOuRazaoSocial){
		
			TypeQuery<Pessoa> consulta = ... // consulta padrao + filtros dos parametros
			
			consulta.setParameter("empresa",contexto.getEmpresa());
		
			return consulta.getResultList();
		
		};
		
	}
Alguém  passou por esta situação? Qual a solução? Usar ThreadLocal? E se não estiver na mesma JVM?

Obrigado pela ajuda.

3 Respostas

DaniloAndrade

porque vc não seta os dados que vc precisa desse contexto como um filtro tambem

por ex:

public List<Pessoa> listaTodos(){  
         filtros.add(new Filtro("empresa",contexto.getEmpresa()));
        return pessoas.listaTodosComOs(filtros);  
    }

e a injeção do contexto ficaria no seu managerBean

jrdalpra

Esse eh um dos casos.

Porem o problema estah qdo nao tenho a lista de filtros, porem preciso restringir as consultas por contexto.

Valeu.

jrdalpra

Mudei o código. Agora fica mais claro o que eu preciso.

Obrigado pela sua resposta.

DaniloAndrade:
porque vc não seta os dados que vc precisa desse contexto como um filtro tambem

por ex:

public List<Pessoa> listaTodos(){  
         filtros.add(new Filtro("empresa",contexto.getEmpresa()));
        return pessoas.listaTodosComOs(filtros);  
    }

e a injeção do contexto ficaria no seu managerBean

Criado 22 de abril de 2013
Ultima resposta 22 de abr. de 2013
Respostas 3
Participantes 2