Injetar dependencia de um conteiner EJB em outro Conteiner EJB
17 respostas
H
hugossilva
Pessoal,
eu tenho um projecto SEAM WEB PROJECT e um outro EJB PROJECT associado ao EAR do meu WEB PROJECT eu gostaria de saber se existe alguma forma de eu injetar dependencias do meu CONTEINER EJB do meu EJB project no meu CONTEINER EJB do meu WEB PROJECT…
resumindo, eu quero injetar dependencia de um EJB em OUTRO EJB porem em CONTEINERS Diferentes !!!
eu não manjo muito de ejb, não tenho certeza… mas acho que isso resolve, da uma pesquisada ai desse jeito
H
hugossilva
é, Ajudou um pouco, mas a referencia que você me passou é basicamente a mesma coisa da anotação porem sendo feito configurando o arquivo XML, resumindo, voltamos a estaca zero.
Li em alguns lugares que fazendo um lookup do contexto eu consigo carregar os dados de outro conteiner, nao sei se essa informação procede, no entanto eu nao sei muito bem como fazer um e nem se precisa configurar algo em algum XML, nao se tem muita coisa objetiva sobre EJB na internet, na maioria dos foruns que eu vou nao tem nenhum exemplo de como se fazer =/
se mais alguem puder ajudar !!
Hugo Silva
johnny_quest
Uma possível solução seria você disponibilizar seu EJB do outro container como um Web Service
e injetar o Proxy dinamico do seu WS no EJB local que deseja fazer alguma chamada em tal serviço.
Isso com certeza iria funcionar, mas não sei se é o melhor para o seu caso e arquitetura.
H
hugossilva
é, no caso eu queria utilar recursos que fossem do EJB3, web service em ultimo caso até poderia ser utilizado, mas eu gostaria de tentar ver se existe mais alguma outra solução !!!
H
hugossilva
alguem teria mais alguma ideia !?
H
hugossilva
bem, vou deixar o codigo aqui pra poder ficar melhor entendido
esse é o codigo que eu estou utilizando no meu container EJB do meu projeto WEB
@Name(“controle”)
public class IdeiaHome {
publicSimpleDateFormatformat=newSimpleDateFormat("dd/MM/yyyy");publicDatedata=newDate();publicStringcomo;publicintididealizador=10;privateIdeiaideia=newIdeia();@EJB(beanInterface=IdeiaAction.class,beanName="IdeiaActionImpl")privateIdeiaActionIA;publicvoidInicia(){try{data=format.parse("22/11/2010");}catch(ParseExceptione){// TODO Auto-generated catch blocke.printStackTrace();}como="Teste";ideia.setComo(como);ideia.setOque("test");ideia.setTitulo("teste");ideia.setDataCadastro(data);ideia.setIdIdealizador(ididealizador);ideia.setStatus(como);IA.criarIdeia(ideia);}
}
a anotação @EJB teoricamente deveria injetar a dependencia do meu BEAN(IdeiaActionImpl) que está no meu outro projeto EJB, porem nao injeta, e a variavel retorna nula, gostaria de saber se tem algo errado no codigo ou é questão de configuração mesmo ?!
H
hugossilva
Galera,
a unica coisa que eu quero saber é se é possível injetar dependencias de um projeto EJB em outro projeto !!!
eles estão na mesma maquina, no entanto são projetos diferentes, isso é possível ?!
Hugo Silva
F
fre_d
Hugo,
podes explicar melhor ? Não sei se entendi direito.
Você quer injetar um EJB do projeto EJB no projeto WEB ? Vocês tem permissão para realizar alterações no servidor de aplicações ?
Abraço,
Fred
hugossilva:
Galera,
a unica coisa que eu quero saber é se é possível injetar dependencias de um projeto EJB em outro projeto !!!
eles estão na mesma maquina, no entanto são projetos diferentes, isso é possível ?!
Hugo Silva
H
hugossilva
Seguinte,
Imagine que eu tenho 2 projetos EJB’s, eu queria saber se existe a possibilidade de injetar dependencias de um projeto EJB no outro…
no meu caso, eu tenho um SEAM WEB PROJECT, quando criado ele gera um app web, um EAR e um modulo EJB, e eu criei um PROJETO EJB a parte associado ao meu EAR do projeto WEB, para que isso
o meu projeto web seria os controles e o meu projeto ejb os meus modelos, o que eu queria saber é como acessar as classes do meu projeto ejb atraves do ejb do meu projeto web !!!
ou seja
injetar dependencias de um projeto EJB em OUTRO projeto, eles estao na mesma maquina, porem sao projetos distintos que eu mesmo criei, entendeu ?!
F
fre_d
Hugo, tem como fazer isso. Eu faço isso usando o JBoss expecificando somente @EJB(mappedName=“xxxx”), qual servidor de aplicações você usa ?
Você precisa especificar qual projeto EJB deve ser criado primeiro.
Abraço,
Fred
H
hugossilva
eu utilizo o JBOSS 5.1,
fre_d voce poderia me dar um exemplo de como voce faz ?!
abraço
F
fre_d
Minha eplicação está estruturada da seguinte forma:
Projeto Base
1-base.ear
1-base.war
Projeto Principal
2-dependente.ear
2-dependente.war
Meus ejbs são locais:
@Stateless
@Local({InterfaceLocal.class})
@LocalBinding(jndiBinding ="aplicacao/MeuEjb/local")
public class MeuEjb implements InterfaceLocal{
}
No no ejb do projeto 2-principal.ear eu coloco assim
@EJB(mappedName="aplicacao/MeuEjb/local")
public void InterfaceLocal getMeuEjb(){
return interfaceLocal; //variável private
}
Abraço,
Fred
hugossilva:
eu utilizo o JBOSS 5.1,
fre_d voce poderia me dar um exemplo de como voce faz ?!
abraço
H
hugossilva
Exception during request processing:
Caused by javax.servlet.ServletException with message: “#{controle.Inicia}: java.lang.NullPointerException”
tentei do jeito que voce falou e retorna esse erro quando eu tento injetar
retorna um nullpointer
Lembrando que o meu projeto 1 é um EAR e meu projeto 2 é um EJB PROJECT associado a esse EAR
F
fre_d
Quem faz deploy primeiro ? E em qual projeto está o ejb ?
H
hugossilva
Galera,
consegui resolver,
realmente não era possível injetar uma dependencia utilizando a anotação @EJB, principalmente porque os containers eram diferentes
fiz por lookup mesmo
o problema era a referencia do meu EJB no meu EAR, notei no log do jboss o seguinte comentario
10:58:44,125 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
ideia-ear/IdeiaActionImpl/local - EJB3.x Default Local Business Interface
ideia-ear/IdeiaActionImpl/local-com.prana.ideia.model.IdeiaAction - EJB3.x Local Business Interface</blockquote>
essa era a referencia do meu EJB no JNDI, partindo desse principio eu apenas alterei o lookup para pegar o contexto desse caminho
ideiaAction = (IdeiaAction) new InitialContext().lookup("ideia-ear/IdeiaActionImpl/local");
ideiaAction.CriarIdeia("TESTE");
e funcionou perfeitamente
abraço a todos !!!
H
hugossilva
Pessoal,
outra coisa interessante, utilizando a anotação @Resource voce consegue injetar dependencias que estejam no seu contexto do JNDI
seria basicamente a mesma coisa que eu sitei no post anterior, só que ao invez de utilizar o initialContext voce utilizaria a anotação @Resource
ficaria basicamente assim
@Resource(name="ideia-ear/IdeiaActionImpl/local") //onde o name é o caminho do seu ejb no JNDI <--- isso é especificado no console do servidor
private IdeiaAction ideiaAction;
pronto, sua variavel está injetada com a dependencia de outro conteiner =)