Re: Usage in Axis2

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Sat Jul 21 2007 - 04:16:32 EDT

  • Next message: Andrus Adamchik: "Re: show table status"

    Glad you solved the problem, but now it presents a challenge to us -
    how do we support Axis class loading mechanism out of the box without
    breaking everything else (thread class loader so far worked in all
    environments I've tried...) I guess we need to do more research and
    testing. Can I ask you a favor - could you please open a bug report
    in Jira with a link to this discussion, so that it won't get forgotten:

    http://issues.apache.org/cayenne/

    Thanks
    Andrus

    On Jul 21, 2007, at 1:25 AM, Ajay H. Daptardar wrote:

    > Hi Andrus,
    >
    > I managed to hack a fix. In the Util class, the getJavaClass method
    > gets the class loader as:
    >
    > <code>
    >
    > ClassLoader classLoader = Thread.currentThread
    > ().getContextClassLoader();
    >
    > if (classLoader == null) {
    > classLoader = Util.class.getClassLoader();
    > }
    >
    > </code>
    >
    > However (and I did verify this) the class loader is the one that
    > tomcat uses for the Axis2 servlet. Here's how Axis2 uses class loaders
    >
    >
    > Axis2 has the notion of service isolation where each service or module
    > gets its own class loader. Using this class loader you can access any
    > resource that you put into your service archive file.
    >
    > [See http://docs.huihoo.com/apache/axis/axis2-1.0-docs/xdocs/
    > faq.html#b1]
    >
    > The fix was the following:
    >
    > <code>
    >
    > ClassLoader classLoader = null;
    >
    > if (classLoader == null) {
    > classLoader = Util.class.getClassLoader();
    > }
    >
    > </code>
    >
    > this correctly gets the class loader that Axis2 assigned to the
    > particular WS.
    >
    > Best,
    > - Ajay
    >
    > On 7/20/07, Ajay H. Daptardar <ajay.daptarda..mail.com> wrote:
    >> Hi Andrus,
    >>
    >> I tried the 3.0M1 build and am still getting the class not found
    >> error
    >> although manifest as a CayenneRuntimeException caused by
    >> ClassNotFoundException.
    >>
    >> Here is a trace:
    >>
    >> Caused by: org.apache.cayenne.CayenneRuntimeException: [v.3.0M1
    >> Jul 16
    >> 2007 22:17:38] Failed to load class com.app.AnnotationType:
    >> com.app.AnnotationType
    >> at org.apache.cayenne.map.ObjEntity.getJavaClass
    >> (ObjEntity.java:238)
    >> at
    >> org.apache.cayenne.reflect.PersistentDescriptorFactory.getDescriptor(
    >> PersistentDescriptorFactory.java:50)
    >> at
    >> org.apache.cayenne.reflect.ClassDescriptorMap.createDescriptor
    >> (ClassDescriptorMap.java:122)
    >> at
    >> org.apache.cayenne.reflect.LazyClassDescriptorDecorator.checkDescript
    >> orInitialized(LazyClassDescriptorDecorator.java:49)
    >> at
    >> org.apache.cayenne.reflect.LazyClassDescriptorDecorator.createObject(
    >> LazyClassDescriptorDecorator.java:63)
    >> at org.apache.cayenne.access.DataContext.newObject
    >> (DataContext.java:752)
    >> ... 26 more
    >> Caused by: java.lang.ClassNotFoundException: com.app.AnnotationType
    >> at org.apache.catalina.loader.WebappClassLoader.loadClass
    >> (WebappClassLoader.java:1359)
    >> at org.apache.catalina.loader.WebappClassLoader.loadClass
    >> (WebappClassLoader.java:1205)
    >> at java.lang.ClassLoader.loadClassInternal
    >> (ClassLoader.java:319)
    >> at java.lang.Class.forName0(Native Method)
    >> at java.lang.Class.forName(Class.java:242)
    >> at org.apache.cayenne.util.Util.getJavaClass(Util.java:566)
    >> at org.apache.cayenne.map.ObjEntity.getJavaClass
    >> (ObjEntity.java:235)
    >> ... 31 more
    >>
    >> The problem is not that Cayenne cannot be found, it occurs when
    >> Cayenne tries to load the mapped classes using the web app class
    >> loader. What I don't get is that why the web app class loader cannot
    >> load the classes.
    >>
    >> I am guessing that Axis2 creates a class loader for each web service,
    >> loads the application classes and the jars in the lib folder (thats
    >> why it finds Cayenne jars). But when Cayenne retrieves a class loader
    >> (WebappClassLoader), this class loader is probably the one for the
    >> Axis2 web service, not the one that Axis2 is using to load web
    >> services.
    >>
    >> Probably there is a way to get the class loader for the particular
    >> web
    >> service within the Axis2 (webapp) servlet.
    >>
    >> Best,
    >> - Ajay
    >>
    >>
    >>
    >> On 7/20/07, Andrus Adamchik <andru..bjectstyle.org> wrote:
    >> > This felt like a nested ClassLoader issue from the beginning...
    >> I am
    >> > not familiar with the Axis2 archive details, but is it possible to
    >> > put Cayenne jar at the same level as the application classes?
    >> >
    >> > Alternatively you can try upgrading to 3.0M1 (you can grab an
    >> > *unofficial* build from here: http://people.apache.org/~aadamchik/
    >> > release/3.0M1/). 3.0 uses String class names as keys and should
    >> > hopefully be free from this problem. Please let me know if that
    >> > worked - we will definitely need to fix it if it is still broken
    >> in 3.0.
    >> >
    >> > > // DataMaps can contain all kinds of
    >> garbage...
    >> > > // TODO (Andrus, 10/18/2005) it would
    >> be nice
    >> > > to log something
    >> > > // here, but since EntityResolver is
    >> used on
    >> > > the client, log4J is
    >> > > // a no-go...
    >> >
    >> > Good catch. This is also obsolete in 3.0 - we can use commons
    >> > logging. Let me clean it up.
    >> >
    >> > Andrus
    >> >
    >> >
    >> >
    >> > > // TODO (Andrus, 10/18/2005) it would be nice
    >> > > to log something
    >> > > // here, but since EntityResolver is
    >> used on
    >> > > the client, log4J is
    >> > > // a no-go...
    >> >
    >> >
    >> >
    >> >
    >> > On Jul 20, 2007, at 9:15 PM, Ajay H. Daptardar wrote:
    >> >
    >> > > Hi Andrus,
    >> > >
    >> > > The structure of the Axis2 archive (app.aar) is as follows:
    >> > >
    >> > > META-INF/
    >> > > META-INF/MANIFEST.MF
    >> > > META-INF/services.xml
    >> > > lib/
    >> > > lib/bcel.jar
    >> > > lib/cayenne.jar
    >> > > lib/jibx-bind.jar
    >> > > lib/jibx-extras.jar
    >> > > lib/jibx-genbinding.jar
    >> > > lib/jibx-genschema.jar
    >> > > lib/jibx-run.jar
    >> > > lib/mysql-connector-java-5.0.6-bin.jar
    >> > > lib/qdox-1.6.1.jar
    >> > > lib/stax-api.jar
    >> > > lib/wstx-asl.jar
    >> > > lib/xmlpull_1_1_4.jar
    >> > > lib/xpp3.jar
    >> > > app/<APPLICATION CLASSES>
    >> > >
    >> > > Cayenne jar is in the application's lib folder not axis'. After
    >> > > stepping through the debugger, I found out that even though the
    >> > > application can load the Cayenne data context, the entity
    >> resolver,
    >> > > when it PUTS object entities in the cache, it uses the name of
    >> the
    >> > > entity and when it tries to GET the object entity, it tries to
    >> use the
    >> > > oe.getJavaClass() which throws an exception. This is not
    >> logged and
    >> > > the comment there is:
    >> > >
    >> > > // DataMaps can contain all kinds of
    >> garbage...
    >> > > // TODO (Andrus, 10/18/2005) it would
    >> be nice
    >> > > to log something
    >> > > // here, but since EntityResolver is
    >> used on
    >> > > the client, log4J is
    >> > > // a no-go...
    >> > >
    >> > > the Util.getJavaClass() fails to load the (application) class it
    >> > > seems.
    >> > >
    >> > > Thanks,
    >> > > Best,
    >> > > - Ajay
    >> > >
    >> > >
    >> > >
    >> > >
    >> > >
    >> > > On 7/19/07, Andrus Adamchik <andru..bjectstyle.org> wrote:
    >> > >> That is strange... I assume Cayenne jars are in "axis2/WEB-
    >> INF/lib",
    >> > >> and not in some shared location?
    >> > >>
    >> > >> Andrus
    >> > >>
    >> > >> On Jul 18, 2007, at 11:53 PM, Ajay H. Daptardar wrote:
    >> > >> > Hello all,
    >> > >> >
    >> > >> > I am trying to use Cayenne within Axis2. I copied the three
    >> > >> > configuration XML files into the classes folder for Axis2:
    >> > >> >
    >> > >> > /opt/apache-tomcat-6.0.13/webapps/axis2/WEB-INF/classes
    >> > >> >
    >> > >> > I can create the data context object but during runtime, data
    >> > >> > context's entity resolver cannot find the mapped class and
    >> I get
    >> > >> the
    >> > >> > following:
    >> > >> >
    >> > >> > "Class is not mapped with Cayenne"
    >> > >> >
    >> > >> > However when I run the same application as standalone, I
    >> have no
    >> > >> > errors.
    >> > >> >
    >> > >> > Any help much appreciated.
    >> > >> >
    >> > >> > Best,
    >> > >> > - Ajay
    >> > >> >
    >> > >>
    >> > >>
    >> > >
    >> > >
    >> > > --
    >> > > The mind is everything; what you think, you become. -- Buddha
    >> > >
    >> >
    >> >
    >>
    >>
    >> --
    >> The mind is everything; what you think, you become. -- Buddha
    >>
    >
    >
    > --
    > The mind is everything; what you think, you become. -- Buddha
    >



    This archive was generated by hypermail 2.0.0 : Sat Jul 21 2007 - 04:17:03 EDT