You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Kathy Chan <ka...@ca.ibm.com> on 2006/01/24 21:33:07 UTC
Different class loader used to determine if attachment is supported and to
handle type mapping
Hi,
We are using Axis 1.2.1 and noticed the following behaviour (same
behaviour in Axis 1.3):
We call org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask to generate WSDL
from Java. The first thing Java2WsdlAntTask does is:
AntClassLoader cl = new AntClassLoader(getClass().getClassLoader(),
getProject(),
classpath == null ? createClasspath() : classpath,
false);
ClassUtils.setDefaultClassLoader(cl);
If the classpath for Java2WsdlAntTask includes activation.jar, when
JavaUtils.isAttachmentSupported() is called, since
ClassUtils.forName("javax.activation.DataHandler");
can be successfully executed, attachmentSupportEnabled is set to true.
However, later on, when Java2WsdlAntTask is constructing
org.apache.axis.wsdl.fromJava.Emitter, I got the exception:
java.lang.NoClassDefFoundError: javax/activation/DataSource
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at
org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory.class$(JAFDataHandlerSerializerFactory.java:37)
at
org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory.getSerializerClass(JAFDataHandlerSerializerFactory.java:46)
at
org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory.<init>(JAFDataHandlerSerializerFactory.java:34)
at
org.apache.axis.encoding.DefaultTypeMappingImpl.initMappings(DefaultTypeMappingImpl.java:120)
at
org.apache.axis.encoding.DefaultTypeMappingImpl.<init>(DefaultTypeMappingImpl.java:91)
at
org.apache.axis.encoding.DefaultTypeMappingImpl.getSingletonDelegate(DefaultTypeMappingImpl.java:85)
at
org.apache.axis.encoding.TypeMappingRegistryImpl.<init>(TypeMappingRegistryImpl.java:155)
at
org.apache.axis.encoding.TypeMappingRegistryImpl.<init>(TypeMappingRegistryImpl.java:149)
at
org.apache.axis.wsdl.fromJava.Emitter.<clinit>(Emitter.java:747)
at
org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask.execute(Java2WsdlAntTask.java:172)
Apparently, when initializing the type mapping registry,
JAFDataHandlerSerializerFactory is called (since attachmentSupportEnabled
is set to true). It uses the Emitter's classloader, which does not have
activation.jar in it's classpath (activation.jar and mail.jar is not in
the Axis/lib directory).
My question is, shouldn't JavaUtils.isAttachmentSupported() be using the
Emitter's classloader (like the rest of the other code called by the
Emitter) rather than ClassUtils.forName (which uses the classloader based
on the classpath passed to Java2WsdlAntTask)? The fact that one
classloader is used to determine if attachment is supported and another
one is used to handling attachment type mapping is giving us trouble.
I've opened
http://issues.apache.org/jira/browse/AXIS-2146
for this problem and is wondering if others are running into similar
problem.
Regards,
Kathy Chan