eu tenho um módulo ejb onde eu criei um stateless session bean (usei a anotação @Stateless) que implementa uma interface anotada com @Local. Se eu de outro ejb do mesmo módulo chamar esse ejb através de uma anotação @EJB beleza. Tudo funciona as mil maravilhas. Porém eu criei nesse módulo uma classe simples (POJO) onde eu quero ter uma referência desse session bean para executar alguns serviços. Para isso eu fiz um lookup seguindo as especificações desse link: https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB
Porém não consigo, sempre no momento do lookup eu recebo o erro de NameNotFoundException. Eu já tentei colocar o nome JNDI de várias formas, entre elas:
(lembrando que meu bean se chama MeuEjbBean e minha interface se chama IMeuEjbLocal)
Não funcionou com nenhuma dessas formas, sempre o mesmo erro. Também tentei colocar um nome usando a anotação @Stateless(name=“blablabla”, beanInterface=FooLocal.class) e trocar todos os exemplos acima por “blablabla”, mas também não rolou.
Uma coisa curiosa é que se eu mudo a interface para @Remote ao invés de @Local, funciona na boa! O lookup rola de primeira usando o JNDI assim:
“nome.do.pacote.IMeuEjbLocal”
O que pode estar errado ou qual a forma correta de se fazer?
OBS: Não, eu não tenho um ejb-jar.xml pois eu uso EJB 3 e nunca precisei criar esse arquivo, tanto que como Remote o lookup ocorre!
OBS2: Uso EJB3 e Glassfish.
Vou tentar explicar melhor, porem sou pessimo nisso.
Você consegue invocar seu EJB remoto com seu pojo pois seu EJB está dentro do container porém aceita chamadas remotas.
Faça um teste: invoque seu EJB remoto atraves do pojo, crie um EJB local e faça o deploy junto com seu projeto e faça o seu EJB remoto fazer o lookup do seu EJB local que vai funcionar pois ambos (EJB Remoto e local) estão dentro do container (e aplicação) e o EJB local so responde a chamadas locais, ou seja, vindas dentro do mesmo container…
[quote=pdioniziofilho]Vou tentar explicar melhor, porem sou pessimo nisso.
Você consegue invocar seu EJB remoto com seu pojo pois seu EJB está dentro do container porém aceita chamadas remotas.
Faça um teste: invoque seu EJB remoto atraves do pojo, crie um EJB local e faça o deploy junto com seu projeto e faça o seu EJB remoto fazer o lookup do seu EJB local que vai funcionar pois ambos (EJB Remoto e local) estão dentro do container (e aplicação) e o EJB local so responde a chamadas locais, ou seja, vindas dentro do mesmo container…
The following example illustrates use of all portable elements of the EJB annotation. In this case, the
enterprise bean reference would have the name java:comp/env/ejb/shopping-cart in the
referencing bean?s naming context. This reference is linked to a bean named cart1.
@EJB(
name="ejb/shopping-cart",
beanInterface=ShoppingCart.class,
beanName="cart1",
description="The shopping cart for this application"
)
private ShoppingCart myCart;
Afinal uma instância de ShoppingCart estará em MyCart ou em cart1? O que vem a ser esse cart1 afinal?
Aí nei.junior, tive uma pequena evolução aqui. Eu não sei como estão seus pacotes/módulos aí, mas o meu estava assim:
tenho um EAR que por sua vez possui uma Web Application e um EJB Module. Quando eu criei meu POJO (New Java Class…) eu fiz dentro do próprio módulo EJB, ou seja, eu tinha meus EJBs Stateless em um pacote e meu pojo em outro pacote. Não funciona de jeito nenhum. Daí eu simplesmente passei minha classe java para minha web application e tudo funcionou normalmente. Agora o que está me intrigando é porque isso? Pra mim pelo menos não faz nenhum sentido essa de não poder estar no mesmo módulo EJB, pois quando a classe java simples está no mesmo módulo eu não consigo uma instância de um EJB nem via injeção usando @EJB e nem usando lookup?
Só aproveitando o tópico, você consegue usar anotações em classes POJO para chamar um EJB? Eu li em algum lugar que isso é possível se o POJO roda no servidor, mas nunca consegui fazer aqui.