Lookup em um EJB Local

Bom dia,

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)

[i]java:comp/env/MeuEjbBean
java:comp/env/IMeuEjbLocal
java:comp/env/nome.do.pacote.MeuEjbBean
java:comp/env/nome.do.pacote.IMeuEjbLocal

java:comp/env/ejb/MeuEjbBean
java:comp/env/ejb/IMeuEjbLocal (interface)
java:comp/env/ejb/nome.do.pacote.MeuEjbBean
java:comp/env/ejb/nome.do.pacote.IMeuEjbLocal

MeuEjbBean
IMeuEjbLocal
nome.do.pacote.MeuEjbBean
nome.do.pacote.IMeuEjbLocal

MeuEjbBean/local
IMeuEjbLocal/local
nome.do.pacote.MeuEjbBean/local
nome.do.pacote.IMeuEjbLocal/local[/i]

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.

grato.

Danilo G. Magrini

Resumindo

Presumo que esse seu pojo esteja fora do Container, assim você só consegue fazer lookups remotos mesmo.

Lookups locais somente com classes dentro do mesmo container…

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…

Entendeu?

[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…

Entendeu? [/quote]

Beleza entendi. Só não entendi porque isso aqui então https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB ?

Por curiosidade também tentei seguir os procedimentos do link do Glassfish. Porém obtive o mesmo erro que o townray.

Alguém tem alguma sugestão ?

Pois é. Eu inclusive ainda não entendi os atributos da anotação @EJB. Veja o que diz na página 415 da especificação do ejb3 disponível em http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html

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.

que eu saiba e que eu consegui aqui só por lookup mesmo.