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