问题
I am getting below error when I am looking up a JNDI connection for jdbc datasource:
javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component. This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request. Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application. Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names. [Root exception is javax.naming.NameNotFoundException: Name not found in context "java:".]
My lookup code is inside a static method. Is that the reason for this error. I am not creating any threads
It works in tomcat without any issue
Thanks for your help
Code I am using is something like below:
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
Context cxt = (Context) ctx.lookup("java:/comp/env/");
Stacktrace:
C1APP522 2 2013-07-01 21:57:18,332 ERROR DBUtil get EnvContext failed
javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component. This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request. Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application. Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names. [Root exception is javax.naming.NameNotFoundException: Name not found in context "java:".]
at com.ibm.ws.naming.java.javaURLContextImpl.throwConfigurationExceptionWithDefaultJavaNS(javaURLContextImpl.java:428)
at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:399)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:220)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:160)
at javax.naming.InitialContext.lookup(InitialContext.java:436)
at com.test.integration.database.DBUtil_Ext.getEnvContext(DBUtil_Ext.java:121)
at com.test.integration.database.DBUtil_Ext.getDataSource(DBUtil_Ext.java:102)
at com.test.integration.database.DBUtil_Ext.getConnection(DBUtil_Ext.java:70)
at com.test.integration.IntegrationTransportPlugin_Ext.send(IntegrationTransportPlugin_Ext.java:107)
at com.test.integration.IntegrationTransportPlugin_Ext.send(IntegrationTransportPlugin_Ext.gs)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at com.test.system.integration.plugins.PluginProxy.invoke(PluginProxy.java:66)
at $Proxy58.send(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at com.test.system.integration.plugins.PluginCallTraceImpl$PluginCallTraceHandler.invoke(PluginCallTraceImpl.java:61)
at $Proxy58.send(Unknown Source)
at com.test.system.integration.messaging.dispatch.MessageWriter$2.run(MessageWriter.java:347)
at com.test.system.transaction.ScopedUserTransaction.run(ScopedUserTransaction.java:54)
at com.test.system.transaction.TransactionManagerImpl.execute(TransactionManagerImpl.java:111)
at com.test.system.integration.messaging.dispatch.AckHelper.executeMessageOperation(AckHelper.java:137)
at com.test.system.integration.messaging.dispatch.AckHelper.executeMessageOperation(AckHelper.java:121)
at com.test.system.integration.messaging.dispatch.MessageWriter.executeSendAndAfterSendInTxn(MessageWriter.java:332)
at com.test.system.integration.messaging.dispatch.MessageWriter.sendNextMessage(MessageWriter.java:272)
at com.test.system.integration.messaging.dispatch.MessageSenderRunnable.trySendMessage(MessageSenderRunnable.java:52)
at com.test.system.integration.messaging.dispatch.MessageSenderRunnable.send(MessageSenderRunnable.java:42)
at com.test.system.integration.messaging.dispatch.MessageSenderRunnable.run(MessageSenderRunnable.java:30)
at com.test.system.integration.messaging.dispatch.MessageWriter$CatchesExceptionRunnable.run(MessageWriter.java:603)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
at java.util.concurrent.FutureTask.run(FutureTask.java:149)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
at java.lang.Thread.run(Thread.java:736)
Caused by: javax.naming.NameNotFoundException: Name not found in context "java:".
at com.ibm.ws.naming.ipbase.NameSpace.getParentCtxInternal(NameSpace.java:1837)
at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1166)
at com.ibm.ws.naming.ipbase.NameSpace.lookup(NameSpace.java:1095)
at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1233)
at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:395)
... 37 more
C1APP522 2013-07-01 21:57:18,332 ERROR Messaging Exception in MessageSenderRunnable
java.lang.RuntimeException: get EnvContext failed
at com.test.integration.database.DBUtil_Ext.getEnvContext(DBUtil_Ext.java:125)
at com.test.integration.database.DBUtil_Ext.getDataSource(DBUtil_Ext.java:102)
at com.test.integration.database.DBUtil_Ext.getConnection(DBUtil_Ext.java:70)
at com.test.integration.IntegrationTransportPlugin_Ext.send(IntegrationTransportPlugin_Ext.java:107)
at com.test.integration.IntegrationTransportPlugin_Ext.send(IntegrationTransportPlugin_Ext.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at com.test.system.integration.plugins.PluginProxy.invoke(PluginProxy.java:66)
at $Proxy58.send(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at com.test.system.integration.plugins.PluginCallTraceImpl$PluginCallTraceHandler.invoke(PluginCallTraceImpl.java:61)
at $Proxy58.send(Unknown Source)
at com.test.system.integration.messaging.dispatch.MessageWriter$2.run(MessageWriter.java:347)
at com.test.system.transaction.ScopedUserTransaction.run(ScopedUserTransaction.java:54)
at com.test.system.transaction.TransactionManagerImpl.execute(TransactionManagerImpl.java:111)
at com.test.system.integration.messaging.dispatch.AckHelper.executeMessageOperation(AckHelper.java:137)
at com.test.system.integration.messaging.dispatch.AckHelper.executeMessageOperation(AckHelper.java:121)
at com.test.system.integration.messaging.dispatch.MessageWriter.executeSendAndAfterSendInTxn(MessageWriter.java:332)
at com.test.system.integration.messaging.dispatch.MessageWriter.sendNextMessage(MessageWriter.java:272)
at com.test.system.integration.messaging.dispatch.MessageSenderRunnable.trySendMessage(MessageSenderRunnable.java:52)
at com.test.system.integration.messaging.dispatch.MessageSenderRunnable.send(MessageSenderRunnable.java:42)
at com.test.system.integration.messaging.dispatch.MessageSenderRunnable.run(MessageSenderRunnable.java:30)
at com.test.system.integration.messaging.dispatch.MessageWriter$CatchesExceptionRunnable.run(MessageWriter.java:603)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
at java.util.concurrent.FutureTask.run(FutureTask.java:149)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
at java.lang.Thread.run(Thread.java:736)
回答1:
Assuming you have data source configured in WAS, you have two options:
a. During deployment bind data source into calling component's namespace and use the name starting with 'java:comp/env/' for lookup. For example, to bind data source for the whole web application you should add the following to web.xml:
<resource-ref>
<res-ref-name>name_used_in_lookup</res-ref-name>
<jndi-name>data_source_jndi_name</jndi-name>
</resource-ref>
name_used_in_lookup should be without 'java:comp/env/' part.
b. Look up data source directly by its JNDI name without using 'java:comp/env/'
来源:https://stackoverflow.com/questions/17412171/websphere-jndi-lookup-fails