You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Dimitar Valov <di...@gmail.com> on 2015/11/05 12:51:24 UTC

Tomcat's JNDI lookups fail if java.naming.factory.object property is specified

Hello,

Exceptions such as this are found in the logs when
java.naming.factory.object is present
04-Nov-2015 15:40:51.560 SEVERE [main]
org.apache.catalina.realm.UserDatabaseRealm.startInternal Exception looking
up UserDatabase under key UserDatabase
 java.lang.ClassCastException: Cannot cast class
org.apache.naming.ResourceRef to interface org.apache.catalina.UserDatabase
        at
org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:232)
        at
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:249)
        at
org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
        at
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:905)
        at
org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
        at
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.core.StandardService.startInternal(StandardService.java:439)
        at
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:769)
        at
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
It is also not possible to add additional ObjectFactories with
java.naming.factory.object property.

Steps to reproduce:

setenv.bat:
set JAVA_OPTS=%JAVA_OPTS%
-Djava.naming.factory.object=org.apache.naming.factory.ResourceFactory:custom.CustomObjectFactory

setenv.sh:
export JAVA_OPTS=$JAVA_OPTS
-Djava.naming.factory.object=org.apache.naming.factory.ResourceFactory:custom.CustomObjectFactory

Details:

1. org.apache.naming.ResourceRef.getFactoryClassName() returns null:
https://github.com/apache/tomcat/blob/trunk/java/org/apache/naming/ResourceRef.java#L134

2. Consequently
http://docs.oracle.com/javase/8/docs/api/javax/naming/spi/NamingManager.html#getObjectInstance-java.lang.Object-javax.naming.Name-javax.naming.Context-java.util.Hashtable-
falls
to option 3, however the environment does not contain any values and
returns the refInfo (An object created using refInfo; or refInfo if an
object cannot be created using the algorithm described above.).

Possible Reasons:

1. org.apache.catalina.core.NamingContextListener.lifecycleEvent() uses an
empty Hashtable for specifying the environment of the NamingContext:
https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/core/NamingContextListener.java#L235
   This is the place where the environment is initially created before
lookups are made.

Possible Solutions:

1. Add the object factories as specified in the environment to the initial
context environment:

   contextEnv.put(javax.naming.Context.OBJECT_FACTORIES,
System.getProperty(javax.naming.Context.OBJECT_FACTORIES));

   in
https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/core/NamingContextListener.java#L235

Attachments:

The projects.zip contains two maven projects: a web application that uses
custom resource type and extension to Tomcat that adds a custom
ObjectFactory.

Also regarding
https://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories,
there is step "2. Declare Your Resource Requirements" which states to add a
resource-env-ref inside web.xml. I've noticed when the resource is
specified in the Context for this web application this step is not
requried, i.e. lookups are successful. Is this expected?

Best Regards,
Dimitar

Re: Tomcat's JNDI lookups fail if java.naming.factory.object property is specified

Posted by Violeta Georgieva <vi...@apache.org>.
Hi,

2015-11-16 8:39 GMT+02:00 Dimitar Valov <di...@gmail.com>:
>
> Hello,
>
> It is really easy to reproduce this problem even if the default factory
> org.apache.naming.factory.ResourceFactory is used (set
> JAVA_OPTS=%JAVA_OPTS% -Djava.naming.factory.object=
> org.apache.naming.factory.ResourceFactory)
>
> Do you think that this should happen?

I found this in the archives [1]

Regards,
Violeta

[1] http://markmail.org/message/ux4tbigxqrm3tmzy

> Best Regards,
> Dimitar
>
> On Thu, Nov 5, 2015 at 1:51 PM, Dimitar Valov <di...@gmail.com>
> wrote:
>
> > Hello,
> >
> > Exceptions such as this are found in the logs when
> > java.naming.factory.object is present
> > 04-Nov-2015 15:40:51.560 SEVERE [main]
> > org.apache.catalina.realm.UserDatabaseRealm.startInternal Exception
looking
> > up UserDatabase under key UserDatabase
> >  java.lang.ClassCastException: Cannot cast class
> > org.apache.naming.ResourceRef to interface
org.apache.catalina.UserDatabase
> >         at
> >
org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:232)
> >         at
> > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >         at
> >
org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:249)
> >         at
> >
org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
> >         at
> > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >         at
> >
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:905)
> >         at
> >
org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
> >         at
> > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >         at
> >
org.apache.catalina.core.StandardService.startInternal(StandardService.java:439)
> >         at
> > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >         at
> >
org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:769)
> >         at
> > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >         at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >         at
> >
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> >         at
> >
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> >         at java.lang.reflect.Method.invoke(Method.java:497)
> >         at
org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
> >         at
org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
> > It is also not possible to add additional ObjectFactories with
> > java.naming.factory.object property.
> >
> > Steps to reproduce:
> >
> > setenv.bat:
> > set JAVA_OPTS=%JAVA_OPTS%
> >
-Djava.naming.factory.object=org.apache.naming.factory.ResourceFactory:custom.CustomObjectFactory
> >
> > setenv.sh:
> > export JAVA_OPTS=$JAVA_OPTS
> >
-Djava.naming.factory.object=org.apache.naming.factory.ResourceFactory:custom.CustomObjectFactory
> >
> > Details:
> >
> > 1. org.apache.naming.ResourceRef.getFactoryClassName() returns null:
> >
https://github.com/apache/tomcat/blob/trunk/java/org/apache/naming/ResourceRef.java#L134
> >
> > 2. Consequently
> >
http://docs.oracle.com/javase/8/docs/api/javax/naming/spi/NamingManager.html#getObjectInstance-java.lang.Object-javax.naming.Name-javax.naming.Context-java.util.Hashtable-
falls
> > to option 3, however the environment does not contain any values and
> > returns the refInfo (An object created using refInfo; or refInfo if an
> > object cannot be created using the algorithm described above.).
> >
> > Possible Reasons:
> >
> > 1. org.apache.catalina.core.NamingContextListener.lifecycleEvent() uses
an
> > empty Hashtable for specifying the environment of the NamingContext:
> >
https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/core/NamingContextListener.java#L235
> >    This is the place where the environment is initially created before
> > lookups are made.
> >
> > Possible Solutions:
> >
> > 1. Add the object factories as specified in the environment to the
initial
> > context environment:
> >
> >    contextEnv.put(javax.naming.Context.OBJECT_FACTORIES,
> > System.getProperty(javax.naming.Context.OBJECT_FACTORIES));
> >
> >    in
> >
https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/core/NamingContextListener.java#L235
> >
> > Attachments:
> >
> > The projects.zip contains two maven projects: a web application that
uses
> > custom resource type and extension to Tomcat that adds a custom
> > ObjectFactory.
> >
> > Also regarding
> >
https://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories
,
> > there is step "2. Declare Your Resource Requirements" which states to
add a
> > resource-env-ref inside web.xml. I've noticed when the resource is
> > specified in the Context for this web application this step is not
> > requried, i.e. lookups are successful. Is this expected?
> >
> > Best Regards,
> > Dimitar
> >

Re: Tomcat's JNDI lookups fail if java.naming.factory.object property is specified

Posted by Dimitar Valov <di...@gmail.com>.
Hello,

It is really easy to reproduce this problem even if the default factory
org.apache.naming.factory.ResourceFactory is used (set
JAVA_OPTS=%JAVA_OPTS% -Djava.naming.factory.object=
org.apache.naming.factory.ResourceFactory)

Do you think that this should happen?

Best Regards,
Dimitar

On Thu, Nov 5, 2015 at 1:51 PM, Dimitar Valov <di...@gmail.com>
wrote:

> Hello,
>
> Exceptions such as this are found in the logs when
> java.naming.factory.object is present
> 04-Nov-2015 15:40:51.560 SEVERE [main]
> org.apache.catalina.realm.UserDatabaseRealm.startInternal Exception looking
> up UserDatabase under key UserDatabase
>  java.lang.ClassCastException: Cannot cast class
> org.apache.naming.ResourceRef to interface org.apache.catalina.UserDatabase
>         at
> org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:232)
>         at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>         at
> org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:249)
>         at
> org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
>         at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>         at
> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:905)
>         at
> org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
>         at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>         at
> org.apache.catalina.core.StandardService.startInternal(StandardService.java:439)
>         at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>         at
> org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:769)
>         at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>         at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:497)
>         at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
>         at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
> It is also not possible to add additional ObjectFactories with
> java.naming.factory.object property.
>
> Steps to reproduce:
>
> setenv.bat:
> set JAVA_OPTS=%JAVA_OPTS%
> -Djava.naming.factory.object=org.apache.naming.factory.ResourceFactory:custom.CustomObjectFactory
>
> setenv.sh:
> export JAVA_OPTS=$JAVA_OPTS
> -Djava.naming.factory.object=org.apache.naming.factory.ResourceFactory:custom.CustomObjectFactory
>
> Details:
>
> 1. org.apache.naming.ResourceRef.getFactoryClassName() returns null:
> https://github.com/apache/tomcat/blob/trunk/java/org/apache/naming/ResourceRef.java#L134
>
> 2. Consequently
> http://docs.oracle.com/javase/8/docs/api/javax/naming/spi/NamingManager.html#getObjectInstance-java.lang.Object-javax.naming.Name-javax.naming.Context-java.util.Hashtable- falls
> to option 3, however the environment does not contain any values and
> returns the refInfo (An object created using refInfo; or refInfo if an
> object cannot be created using the algorithm described above.).
>
> Possible Reasons:
>
> 1. org.apache.catalina.core.NamingContextListener.lifecycleEvent() uses an
> empty Hashtable for specifying the environment of the NamingContext:
> https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/core/NamingContextListener.java#L235
>    This is the place where the environment is initially created before
> lookups are made.
>
> Possible Solutions:
>
> 1. Add the object factories as specified in the environment to the initial
> context environment:
>
>    contextEnv.put(javax.naming.Context.OBJECT_FACTORIES,
> System.getProperty(javax.naming.Context.OBJECT_FACTORIES));
>
>    in
> https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/core/NamingContextListener.java#L235
>
> Attachments:
>
> The projects.zip contains two maven projects: a web application that uses
> custom resource type and extension to Tomcat that adds a custom
> ObjectFactory.
>
> Also regarding
> https://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories,
> there is step "2. Declare Your Resource Requirements" which states to add a
> resource-env-ref inside web.xml. I've noticed when the resource is
> specified in the Context for this web application this step is not
> requried, i.e. lookups are successful. Is this expected?
>
> Best Regards,
> Dimitar
>