A input Glassfish v3 / JNDI não pode ser encontrada!

Eu tenho tido problemas ao tentar chamar o método de um EJB de um cliente de aplicativo Java. Aqui está o código.

Interface Remota EJB

package com.test; import javax.ejb.Remote; @Remote public interface HelloBeanRemote { public String sayHello(); } 

EJB

 package com.test; import javax.ejb.Stateless; @Stateless (name="HelloBeanExample" , mappedName="ejb/HelloBean") public class HelloBean implements HelloBeanRemote { @Override public String sayHello(){ return "hola"; } } 

Turma principal (outro projeto)

 import com.test.HelloBeanRemote; import javax.naming.Context; import javax.naming.InitialContext; public class Main { public void runTest()throws Exception{ Context ctx = new InitialContext(); HelloBeanRemote bean = (HelloBeanRemote)ctx.lookup("java:global/Test/HelloBeanExample!com.test.HelloBeanRemote"); System.out.println(bean.sayHello()); } public static void main(String[] args)throws Exception { Main main = new Main(); main.runTest(); } } 

Bem, qual é o meu problema? A input JNDI para este EJB não pode ser encontrada!

 java.lang.NullPointerException at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297) at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430) at javax.naming.InitialContext.lookup(InitialContext.java:392) at testdesktop.Main.runTest(Main.java:22) at testdesktop.Main.main(Main.java:31) Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/Test/HelloBeanExample!com.test.HelloBeanRemote' in SerialContext [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext [Root exception is java.lang.NullPointerException]] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442) at javax.naming.InitialContext.lookup(InitialContext.java:392) at testdesktop.Main.runTest(Main.java:22) at testdesktop.Main.main(Main.java:31) Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext [Root exception is java.lang.NullPointerException] at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430) ... 3 more Caused by: java.lang.NullPointerException at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297) at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271) ... 4 more Java Result: 1 

Eu tentei com inputs JNDI diferentes, mas nada funciona (recebi essas inputs do console do NetBeans):

INFO: Nomes JNDI portáveis ​​para EJB HelloBeanExample: [java: global / Teste / HelloBeanExample, java: global / Teste / HelloBeanExample! Com.test.HelloBeanRemote]

INFO: nomes JNDI específicos do Glassfish (não portáteis) para o EJB HelloBeanExample: [ejb / HelloBean, ejb / HelloBean # com.test.HelloBeanRemote]

Então eu tentei com as seguintes inputs, mas eu tenho a mesma exceção:

  1. java: global / Test / HelloBeanExample
  2. java: global / Teste / HelloBeanExample! com.test.HelloBeanRemote
  3. ejb / HelloBean
  4. ejb / HelloBean # com.test.HelloBeanRemote

Estou usando o Netbeans 6.8 e o Glassfish v3!

Na verdade, seu problema não é a consulta da referência JNDI do seu bean ou você obteria algo assim:

 Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found 

Não, aqui, suspeito de um problema de caminho de class simples, você simplesmente está perdendo algum jar no caminho de class de seu projeto de cliente. Com o GlassFish v3, adicionar $GF_HOME/modules/gf-client.jar deve ser suficiente, como mencionado em Como eu access um componente EJB remoto de um cliente Java independente? no GlassFish’s EJB FAQ (minha compreensão é que este jar supostamente substitui $GF_HOME/lib/appserv-rt.jar que está lá por razões de compatibilidade com o GFv2). No entanto, é importante referir o gf-client.jar do diretório de instalação do GlassFish ou os jars declarados em seu manifesto não serão encontrados.

gf-client.jar refere gf-client.jar se a muitos outros .jars do diretório de instalação do GlassFish, portanto, é melhor consultá-lo a partir do próprio diretório de instalação, em vez de copiá-lo (e todos os outros .jars) para outro local.

Depois de corrigir isso, você poderá procurar seu bean usando os nomes JNDI que o GlassFish gera nos logs. Eu sugiro usar os novos nomes JNDI globais portáteis do Java EE 6.

Apenas no caso, o que é a syntax para nomes JNDI globais portáteis no EJB 3.1? A input do GlassFish EJB FAQ fornece um bom resumo desta nova convenção. E se você quiser mais informações, confira: http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names .

Eu encontrei algo! Eu acho que existe uma “maneira especial” de adicionar e configurar componentes usando o NetBeans! Eu tenho lido os tutoriais do netbeans nas páginas da web e aparentemente eu estava fazendo as coisas erradas! Portanto, esta não é uma solução real para este problema, mas talvez se você ler um desses http://netbeans.org/kb/trails/java-ee.html você encontrará suas respostas!

Saudações

Eu encontrei o mesmo problema. Eu pesquisei na web e segui os tutoriais do Oracle linha por linha para configurar um cliente java autônomo, mas nada funciona. Eu encontrei http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html e tem uma informação que eu já tentei resolver o problema.

Vou apenas reiniciar meu IDE, limpar e construir o projeto; pode ser também criar o projeto novamente. E quem sabe, quando a lua está cheia, meu código pode correr bem 🙂 Então, talvez queira tentar isso também

Meu cliente autônomo finalmente corre! O truque era apenas reiniciar o NetBeans IDE, desimplementar o aplicativo e reimplementá-lo. Isso deve resolver seu problema (supondo que não haja outro erro em seu código e configuração).