Glassfish上EJB的可移植JNDI语法查找

以前的尝试是让Netbeans将一个EJB模块部署到Netbeans可以访问的Glassfish服务器上,该模块构建为JAR而不是EAR。 但是,使用asadmin通过CLI将JAR部署到Glassfish 可能会遇到错误 。

EAR通过CLI进行部署而没有问题 – 但是,EJB的JNDI名称似乎不起作用。 差异是什么?

32.4.1.1可移植JNDI语法

三个JNDI名称空间用于可移植的JNDI查找:java:global,java:module和java:app。

java:global JNDI名称空间是使用JNDI查找查找远程企业bean的可移植方式。 JNDI地址具有以下forms:java:global [/ application name] / module name / enterprise bean name [/ interface name]应用程序名称和模块名称默认为应用程序和模块的名称减去文件扩展名。 仅当应用程序打包在EAR中时,才需要应用程序名称。 仅当企业bean实现多个业务接口时,才需要接口名称。

http://docs.oracle.com/javaee/7/tutorial/doc/ejb-intro004.htm

查找此bean的正确语法是什么? 是java:global/HelloEAR/HelloEAR-ejb/greetings.GreetingsBeanRemote ? 我尝试了不止一些变种而没有成功。

部署应用程序:

 thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications HelloEAR  Command list-applications executed successfully. thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin undeploy HelloEAR Command undeploy executed successfully. thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications Nothing to list. No applications are deployed to this target server. Command list-applications executed successfully. thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin deploy NetBeansProjects/HelloEAR/dist/HelloEAR.ear Application deployed with name HelloEAR. Command deploy executed successfully. thufir@dur:~$ 

server.log:

 thufir@dur:~$ thufir@dur:~$ tail glassfish-4.1/glassfish/domains/domain1/logs/server.log -n 15 [2014-09-22T04:58:42.666-0700] [glassfish 4.1] [INFO] [AS-EJB-00055] [javax.enterprise.ejb.container] [tid: _ThreadID=650 _ThreadName=admin-listener(9)] [timeMillis: 1411387122666] [levelValue: 800] [[ Glassfish-specific (Non-portable) JNDI names for EJB GreetingsBean: [greetings.GreetingsBeanRemote#greetings.GreetingsBeanRemote, greetings.GreetingsBeanRemote]]] [2014-09-22T04:58:43.619-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=650 _ThreadName=admin-listener(9)] [timeMillis: 1411387123619] [levelValue: 900] [[ WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]] [2014-09-22T04:58:43.628-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=650 _ThreadName=admin-listener(9)] [timeMillis: 1411387123628] [levelValue: 900] [[ WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]] [2014-09-22T04:58:43.634-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=650 _ThreadName=admin-listener(9)] [timeMillis: 1411387123634] [levelValue: 900] [[ WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]] [2014-09-22T04:58:44.757-0700] [glassfish 4.1] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=650 _ThreadName=admin-listener(9)] [timeMillis: 1411387124757] [levelValue: 800] [[ HelloEAR was successfully deployed in 2,312 milliseconds.]] thufir@dur:~$ 

尝试查找:

 thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/appclient -client NetBeansProjects/RemoteJNDI/dist/RemoteJNDI.jar javax.naming.NamingException: Lookup failed for '[greetings.GreetingsBeanRemote' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1} [Root exception is javax.naming.NameNotFoundException: [greetings.GreetingsBeanRemote not found] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438) at javax.naming.InitialContext.lookup(InitialContext.java:411) at net.bounceme.dur.jndi.RemoteJNDI.main(RemoteJNDI.java:15) Caused by: javax.naming.NameNotFoundException: [greetings.GreetingsBeanRemote not found at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237) at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204) at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66) at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173) at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528) at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199) at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549) at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425) at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930) at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213) at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694) at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496) at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222) at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) thufir@dur:~$ 

为什么没有“java:”或类似的东西调用bean?

成功:

 thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications Nothing to list. No applications are deployed to this target server. Command list-applications executed successfully. thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin deploy NetBeansProjects/HelloEAR/dist/HelloEAR.ear Application deployed with name HelloEAR. Command deploy executed successfully. thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications HelloEAR  Command list-applications executed successfully. thufir@dur:~$ thufir@dur:~$ glassfish-4.1/glassfish/bin/appclient -client NetBeansProjects/RemoteJNDI/dist/RemoteJNDI.jar hello world thufir@dur:~$ thufir@dur:~$ 

客户代码:

 package net.bounceme.dur.jndi; import greetings.GreetingsBeanRemote; import java.util.logging.Logger; import javax.naming.InitialContext; import javax.naming.NamingException; public class RemoteJNDI { private static final Logger log = Logger.getLogger(RemoteJNDI.class.getName()); public static void main(String... args) { try { InitialContext ctx = new InitialContext(); // Object obj = ctx.lookup("java:global/HelloEAR/HelloEAR-ejb/greetings.GreetingsBeanRemote"); Object obj = ctx.lookup("greetings.GreetingsBeanRemote"); GreetingsBeanRemote gbr = (GreetingsBeanRemote) obj; System.out.println(gbr.hi()); } catch (NamingException ex) { ex.printStackTrace(); } } } 

EJB:

 package greetings; import javax.ejb.Stateless; @Stateless public class GreetingsBean implements GreetingsBeanRemote { @Override public String hi() { return "hello world"; } @Override public String bye() { return "bye"; } } 

接口:

 package greetings; import javax.ejb.Remote; @Remote public interface GreetingsBeanRemote { public String hi(); public String bye(); } 

服务器日志:

 [2014-09-22T17:55:56.091-0700] [glassfish 4.1] [INFO] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756091] [levelValue: 800] [[ visiting unvisited references]] [2014-09-22T17:55:56.233-0700] [glassfish 4.1] [INFO] [AS-EJB-00054] [javax.enterprise.ejb.container] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756233] [levelValue: 800] [[ Portable JNDI names for EJB GreetingsBean: [java:global/HelloEAR/HelloEAR-ejb/GreetingsBean!greetings.GreetingsBeanRemote, java:global/HelloEAR/HelloEAR-ejb/GreetingsBean]]] [2014-09-22T17:55:56.235-0700] [glassfish 4.1] [INFO] [AS-EJB-00055] [javax.enterprise.ejb.container] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756235] [levelValue: 800] [[ Glassfish-specific (Non-portable) JNDI names for EJB GreetingsBean: [greetings.GreetingsBeanRemote#greetings.GreetingsBeanRemote, greetings.GreetingsBeanRemote]]] [2014-09-22T17:55:56.321-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756321] [levelValue: 900] [[ WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]] [2014-09-22T17:55:56.341-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756341] [levelValue: 900] [[ WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]] [2014-09-22T17:55:56.349-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756349] [levelValue: 900] [[ WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]] [2014-09-22T17:55:56.819-0700] [glassfish 4.1] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1411433756819] [levelValue: 800] [[ HelloEAR was successfully deployed in 842 milliseconds.]] thufir@dur:~$ 

如果您正在使用Maven,那么检查“-1.0-SNAPSHOT”(或其他版本/根据您的应用程序)是否附加在application-ejb文件名末尾为“application-ejb-1.0-SNAPSHOT”,全名是“java:global / application-ear / application-ejb-1.0-SNAPSHOT / fileName”