2013-04-04 1 views
1

У меня есть приложение Play (я использую Play 2.1.0), из которого я бы хотел вызвать EJB, запущенные на сервере GlassFish. Поэтому я попытался добавить ГФ-Client.jar как зависимость в моем Play приложении и получить ссылку на EJBs таким же образом я хотел бы сделать в отдельном приложении:EJB lookup from Play приложение

Hashtable<String, String> properties = new Hashtable<String, String>(); 
properties.put("java.naming.factory.initial", "com.sun.enterprise.naming.impl.SerialInitContextFactory"); 
properties.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); 
properties.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
properties.put("org.omg.CORBA.ORBInitialHost", "localhost"); 
properties.put("org.omg.CORBA.ORBInitialPort", "3700"); 
properties.put("java.naming.provider.url", "iiop://localhost:3700"); 
Context ctx = new InitialContext(properties); 
ctx.lookup("java:global/MyApplication/MyEJB/MyBean"); 

я получаю однако следующее исключение когда выполняя поиск:

play.api.Application$$anon$1: Execution exception[[RuntimeException: javax.naming.NotContextException: global is not a subcontext]] 
     at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.0] 
     at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.0] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:132) [play_2.10.jar:2.1.0] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:128) [play_2.10.jar:2.1.0] 
     at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.0] 
     at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.0] 
java.lang.RuntimeException: javax.naming.NotContextException: global is not a subcontext 
     at play.libs.F$Promise$6.apply(F.java:401) ~[play_2.10.jar:2.1.0] 
     at scala.concurrent.Future$$anonfun$map$1.liftedTree2$1(Future.scala:253) ~[scala-library.jar:na] 
     at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:249) ~[scala-library.jar:na] 
     at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:249) ~[scala-library.jar:na] 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:29) ~[scala-library.jar:na] 
     at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.liftedTree1$1(BatchingExecutor.scala:67) ~[akka-actor_2.10.jar:na] 
Caused by: javax.naming.NotContextException: global is not a subcontext 
     at tyrex.naming.EnvContext.internalLookup(Unknown Source) ~[tyrex.jar:1.0.1 November 11 2003 1703] 
     at tyrex.naming.EnvContext.lookup(Unknown Source) ~[tyrex.jar:1.0.1 November 11 2003 1703] 
     at tyrex.naming.java.JavaContext.lookup(Unknown Source) ~[tyrex.jar:1.0.1 November 11 2003 1703] 
     at javax.naming.InitialContext.lookup(InitialContext.java:411) ~[na:1.7.0_10] 
     at controllers.Application.index(Application.java:36) ~[na:na] 
     at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:77) ~[na:na] 

Точно такой же код с тем же гс-client.jar зависимости отлично работает от отдельного приложения. Тот факт, что я на самом деле получить это NotContextException и что в StackTrace исключения я вижу следующую строку

at tyrex.naming.EnvContext.lookup(Unknown Source) 

заставляет меня верить, что по какой-то причине InitialContext я получаю не «правильный», так как StackTrace я получаю в моем отдельном приложении, если я указать имя JNDI, которое не существует немного отличается:

Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/Test/MyBean' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: Test] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
    at javax.naming.InitialContext.lookup(InitialContext.java:411) 
    at com.eurodyn.testmavenjavaapp.App.main(App.java:24) 
Caused by: javax.naming.NameNotFoundException: Test 
    at com.sun.enterprise.naming.impl.TransientContext.resolveContext(TransientContext.java:310) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:218) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:219) 
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 
    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:601) 
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144) 
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) 
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) 
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) 
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) 

что я делаю неправильно? Есть ли другой способ выполнить JNDI-поиск из приложения Play? Я понимаю от this Stackoverflow answer, что это то, что можно сделать.

+0

гс-client.jar относится ко многим другим банки, так что лучше обратиться к директории GlassFish так, что он получает все необходимые банки. GlassFish выводит имена EJB JNDI в журналах, пожалуйста, проверьте имя в журнале –

+0

@Abdullah Shaikh Возможно ли это в приложении Play? Насколько я знаю, единственный способ добавления зависимостей - либо из репозитория Maven (метод, который я использовал), либо путем копирования ящиков в папке lib моего приложения, что означало бы, что мне пришлось бы перемещать банку из ее оригинальной все равно. И что, если бы у меня был удаленный GlassFish, работающий на другой машине? В этом случае у меня даже не было бы доступа к каталогу установки GlassFish. – Christina

+0

Ваше имя поиска - «java: global/MyBean», оно должно иметь форму java: global/ваше имя приложения/ejb module/bean name или java: global/ejb module/bean name incase, модуль ejb находится вне уха –

ответ

0

Я исправил эту проблему для меня (Play 2.1.3 и Glassfish 3.1.2.2), добавив gf-client-module к зависимостям в проекте/Build.scala, вместо того, чтобы напрямую связывать банку:

"org.glassfish.main.appclient.client" % "gf-client-module" % "3.1.2.2" 

При разрешении зависимостей он пропустивший модуль org.eclipse.persistence # javax.persistence; 2.0.4.v201112200901, который я смог найти здесь:

resolvers += "opencastproject" at "http://repository.opencastproject.org/nexus/content/groups/public/" 

чтобы быть уверенным, что имя lookup Я проверил имена availabe в этом контексте:

InitialContext ic = getInitialContext(); 
System.out.println(ic.getEnvironment()); 
NamingEnumeration<NameClassPair> childList = ic.list(""); 
while (childList.hasMore()) { 
NameClassPair ncPair = (NameClassPair) childList.next(); 
    if (ncPair.getName().contains("Job") == false) { 
     System.out.println(ncPair.getName() + " (type " + ncPair.getClassName() + ")"); 
    } 
} 

Я использовал имена точно так же, как они были указаны там.

С уважением