You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by Per Newgro <pe...@gmx.ch> on 2007/04/09 10:07:19 UTC
Exception while using env-entry
Hey all,
i defined a env-entry for my bean in ejb-jar.xml
<session>
<ejb-name>MyBean</ejb-name>
<home>my.common.ejb.UseCaseHome</home>
<remote>my.common.ejb.UseCaseRemote</remote>
<ejb-class>my.misc.update.ejb.GetLibrariesContentUcEJB</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Bean</transaction-type>
<resource-ref>
<res-ref-name>MyDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<res-ref-name>MyDSnoTx</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<env-entry>
<description>
The folder of client libraries.
</description>
<env-entry-name>libFolder</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>..\the-ext</env-entry-value>
</env-entry>
</session>
In open-ejb-xml it's simply defined as
<ejb-deployment ejb-name="GetLibrariesContentUC"
deployment-id="GetLibrariesContentUC" container-id="Default Stateful
Container">
<resource-link res-ref-name="MyDS" res-id="MyNyxDS"/>
<resource-link res-ref-name="MyDSnoTx" res-id="MyDSnoTx"/>
</ejb-deployment>
But if i try to access the env entry in the bean i get an
javax.naming.NameNotFoundException: Name "java:comp/env/java:comp/env" not
found.
String extFolderName = getEnvEntry("libFolder");
/**
* Get an environment entry for bean
* @param key of env-entry
* @return Object the defined parameter
* @throws CoreException occured
*/
@SuppressWarnings("unchecked")
private <T> T getEnvEntry(String key) throws CoreException {
SessionContext ictx = getSessionContext();
Context myenv = (Context) ictx.lookup("java:comp/env");
T result = null;
try {
result = (T) myenv.lookup(key);
} catch (NamingException e) {
handleRTException(e);
}
return result;
}
Complete exception is
my.common.exception.DataException: javax.naming.NameNotFoundException:
Name "java:comp/env/java:comp/env" not found.?
at
my.server.ejb.AbstractUseCaseEJB.handleRTException(AbstractUseCaseEJB.java:396)
at my.server.ejb.AbstractUseCaseEJB.start(AbstractUseCaseEJB.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:136)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:119)
at
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:72)
at
org.apache.openejb.core.stateful.StatefulContainer._invoke(StatefulContainer.java:413)
at
org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:375)
at
org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:250)
at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:191)
at
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:61)
at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:182)
at
org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke(Jdk13InvocationHandler.java:49)
at $Proxy34.start(Unknown Source)
at my.client.ejb.UseCaseDelegate.start(UseCaseDelegate.java:108)
at
my.misc.update.frontend.UpdateUcExecutor.updatedLibraries(UpdateUcExecutor.java:105)
at
my.misc.update.frontend.LibrariesUpdateStartup.execute(LibrariesUpdateStartup.java:52)
at my.client.startup.StartupBot.runStartups(StartupBot.java:87)
at my.client.startup.StartupBot.executeStartups(StartupBot.java:55)
at my.client.swing.Main.executeInitialization(Main.java:46)
at my.client.swing.Main.<init>(Main.java:35)
at my.client.swing.Main.main(Main.java:68)
Caused by: java.lang.IllegalArgumentException:
javax.naming.NameNotFoundException: Name "java:comp/env/java:comp/env" not
found.
at org.apache.openejb.core.BaseContext.lookup(BaseContext.java:118)
at
my.server.ejb.AbstractUseCaseEJB.getEnvEntry(AbstractUseCaseEJB.java:497)
at
my.server.ejb.AbstractUseCaseEJB.getEnvEntryFolderName(AbstractUseCaseEJB.java:231)
at
my.misc.update.ejb.LibrariesUcEJBBase.run(LibrariesUcEJBBase.java:55)
at my.server.ejb.AbstractUseCaseEJB.start(AbstractUseCaseEJB.java:182)
at my.server.ejb.AbstractUseCaseEJB.start(AbstractUseCaseEJB.java:154)
... 23 more
Caused by: javax.naming.NameNotFoundException:
Name "java:comp/env/java:comp/env" not found.
at
org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:172)
at
org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:129)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at org.apache.openejb.core.BaseContext.lookup(BaseContext.java:116)
... 28 more
Do i have to add something? Or is my method invalid? Maybe i have to check
first if an empty lookup gives me the result?
Thanks for help
Cheers
Per
Re: Exception while using env-entry
Posted by David Blevins <da...@visi.com>.
Hi Per,
The reason is that lookups performed via the SessionContext interface
are supposed to be relative to java:comp/env. For example:
public void setSessionContext(SessionContext ejbContext){
this.thing = (Thing) ejbContext.lookup("myEntry");
}
and
public void someMethod() {
try {
InitialContext jndiContext = new InitialContext();
this.thing = (Thing) jndiContext.lookup("java:comp/env/
myEntry");
} catch (NamingException e){
throw new IllegalArgumentException("myEntry not found");
}
}
are exactly the same.
The best public info I could find is the javadoc and a few spec
references that show example usages. Unfortunately, the spec never
says explicitly say "java:comp/env" is not required.
Javadoc:
- https://java.sun.com/javaee/5/docs/api/javax/ejb/
EJBContext.html#lookup(java.lang.String)
EJB 3.0 FR Core Contracts, sections:
- 3.4.1
- 3.6.1
- 16.7.1.2
- 16.9.1.2
- 16.10.1.2
Should I be lucky enough to be able to participate again in the next
round of EJB specs, I'm definitely going to get this clarified. The
intention was to add a service locator style lookup method on the
EJBContext to remove the JNDI API cruft people don't like, namely:
- Remove checked exceptions and the need for try/catch
- Remove the need for java:comp/env prefix on all names
- Remove the need for PortableObjectRemote.narrow on bean lookups
Now that said, what I don't recall from the EJB 3.0 EG discussions on
this topic if it was ever concluded that use of "java:comp/env" on
EJBContext.lookup(..) be explicitly disallowed. There are really
only two ways to implement the EJBContext.lookup and depending on
which style you use, you get a very different outcome on that question:
Approach 1:
public Object lookup(String name){
try {
Context ctx = new InitialContext();
return ctx.lookup("java:comp/env/" + name);
...
}
Approach 2:
public Object lookup(String name){
try {
Context ctx = new InitialContext();
ctx = (Context) ctx.lookup("java:comp/env");
return ctx.lookup(name);
...
}
Both result in the same thing if you perform lookups as shown in the
spec (i.e. without java:comp/env), however if you took the second
approach then lookups containing the java:comp/env prefix would still
work. You can guess which approach we have currently :) There is a
third approach actually which is a variant of Approach 2, where the
container magically has the "java:comp/env" Context magically
available to perform lookups on without having to call to new
InitialContext().lookup("java:comp/env") which is very expensive.
That's likely what we'll do in the future, though I'm not sure if we
will allow java:comp/env lookups.
So I can't give a definitive answer on if java:comp/env lookups per
spec intent should be explicitly disallowed, but certainly using that
style defeats the purpose of EJBContext.lookup and could cause you to
miss out on some potential vendor optimizations around JNDI usage.
Hope this helps!
-David
On Apr 9, 2007, at 1:07 AM, Per Newgro wrote:
> Hey all,
>
> i defined a env-entry for my bean in ejb-jar.xml
>
> <session>
> <ejb-name>MyBean</ejb-name>
> <home>my.common.ejb.UseCaseHome</home>
> <remote>my.common.ejb.UseCaseRemote</remote>
> <ejb-class>my.misc.update.ejb.GetLibrariesContentUcEJB</ejb-class>
> <session-type>Stateful</session-type>
> <transaction-type>Bean</transaction-type>
> <resource-ref>
> <res-ref-name>MyDS</res-ref-name>
> <res-type>javax.sql.DataSource</res-type>
> <res-auth>Container</res-auth>
> </resource-ref>
> <resource-ref>
> <res-ref-name>MyDSnoTx</res-ref-name>
> <res-type>javax.sql.DataSource</res-type>
> <res-auth>Container</res-auth>
> </resource-ref>
> <env-entry>
> <description>
> The folder of client libraries.
> </description>
> <env-entry-name>libFolder</env-entry-name>
> <env-entry-type>java.lang.String</env-entry-type>
> <env-entry-value>..\the-ext</env-entry-value>
> </env-entry>
> </session>
>
> In open-ejb-xml it's simply defined as
>
> <ejb-deployment ejb-name="GetLibrariesContentUC"
> deployment-id="GetLibrariesContentUC" container-id="Default Stateful
> Container">
> <resource-link res-ref-name="MyDS" res-id="MyNyxDS"/>
> <resource-link res-ref-name="MyDSnoTx" res-id="MyDSnoTx"/>
> </ejb-deployment>
>
> But if i try to access the env entry in the bean i get an
> javax.naming.NameNotFoundException: Name "java:comp/env/java:comp/
> env" not
> found.
>
> String extFolderName = getEnvEntry("libFolder");
>
> /**
> * Get an environment entry for bean
> * @param key of env-entry
> * @return Object the defined parameter
> * @throws CoreException occured
> */
> @SuppressWarnings("unchecked")
> private <T> T getEnvEntry(String key) throws CoreException {
> SessionContext ictx = getSessionContext();
> Context myenv = (Context) ictx.lookup("java:comp/env");
> T result = null;
> try {
> result = (T) myenv.lookup(key);
> } catch (NamingException e) {
> handleRTException(e);
> }
> return result;
> }
>
> Complete exception is
> my.common.exception.DataException: javax.naming.NameNotFoundException:
> Name "java:comp/env/java:comp/env" not found.?
> at
> my.server.ejb.AbstractUseCaseEJB.handleRTException
> (AbstractUseCaseEJB.java:396)
> at my.server.ejb.AbstractUseCaseEJB.start
> (AbstractUseCaseEJB.java:157)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext
> $Invocation.invoke(ReflectionInvocationContext.java:136)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.procee
> d(ReflectionInvocationContext.java:119)
> at
> org.apache.openejb.core.interceptor.InterceptorStack.invoke
> (InterceptorStack.java:72)
> at
> org.apache.openejb.core.stateful.StatefulContainer._invoke
> (StatefulContainer.java:413)
> at
> org.apache.openejb.core.stateful.StatefulContainer.businessMethod
> (StatefulContainer.java:375)
> at
> org.apache.openejb.core.stateful.StatefulContainer.invoke
> (StatefulContainer.java:250)
> at
> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod
> (EjbObjectProxyHandler.java:191)
> at
> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke
> (EjbObjectProxyHandler.java:61)
> at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke
> (BaseEjbProxyHandler.java:182)
> at
> org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke
> (Jdk13InvocationHandler.java:49)
> at $Proxy34.start(Unknown Source)
> at my.client.ejb.UseCaseDelegate.start(UseCaseDelegate.java:
> 108)
> at
> my.misc.update.frontend.UpdateUcExecutor.updatedLibraries
> (UpdateUcExecutor.java:105)
> at
> my.misc.update.frontend.LibrariesUpdateStartup.execute
> (LibrariesUpdateStartup.java:52)
> at my.client.startup.StartupBot.runStartups(StartupBot.java:
> 87)
> at my.client.startup.StartupBot.executeStartups
> (StartupBot.java:55)
> at my.client.swing.Main.executeInitialization(Main.java:46)
> at my.client.swing.Main.<init>(Main.java:35)
> at my.client.swing.Main.main(Main.java:68)
> Caused by: java.lang.IllegalArgumentException:
> javax.naming.NameNotFoundException: Name "java:comp/env/java:comp/
> env" not
> found.
> at org.apache.openejb.core.BaseContext.lookup
> (BaseContext.java:118)
> at
> my.server.ejb.AbstractUseCaseEJB.getEnvEntry
> (AbstractUseCaseEJB.java:497)
> at
> my.server.ejb.AbstractUseCaseEJB.getEnvEntryFolderName
> (AbstractUseCaseEJB.java:231)
> at
> my.misc.update.ejb.LibrariesUcEJBBase.run(LibrariesUcEJBBase.java:55)
> at my.server.ejb.AbstractUseCaseEJB.start
> (AbstractUseCaseEJB.java:182)
> at my.server.ejb.AbstractUseCaseEJB.start
> (AbstractUseCaseEJB.java:154)
> ... 23 more
> Caused by: javax.naming.NameNotFoundException:
> Name "java:comp/env/java:comp/env" not found.
> at
> org.apache.openejb.core.ivm.naming.IvmContext.federate
> (IvmContext.java:172)
> at
> org.apache.openejb.core.ivm.naming.IvmContext.lookup
> (IvmContext.java:129)
> at javax.naming.InitialContext.lookup(InitialContext.java:351)
> at org.apache.openejb.core.BaseContext.lookup
> (BaseContext.java:116)
> ... 28 more
>
> Do i have to add something? Or is my method invalid? Maybe i have
> to check
> first if an empty lookup gives me the result?
>
> Thanks for help
> Cheers
> Per
>