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 Mitch Gitman <mg...@usa.net> on 2002/12/11 07:01:47 UTC

client classloader confusion

I'm testing a method in my web service: public Parent addParent(String data)
A Parent object contains an array of Child objects, accessible through the 
Parent's: public Child[] getChildrenAsArray()

When I run an Axis client directly and have it call my Axis server, this 
call works fine. But when I run an Axis client launched through JUnit, I 
get a weird, client-only error that the client can't convert a Child array 
to itself:

Dec 10, 2002 7:16:16 PM org.apache.axis.encoding.ser.BeanPropertyTarget set
SEVERE: Could not convert [Lfoo.bar.Child; to bean field 'childrenAsArray', 
type [Lfoo.bar.Child;
Dec 10, 2002 7:16:16 PM org.apache.axis.client.Call invoke
SEVERE: Exception:
java.lang.IllegalArgumentException: argument type mismatch
________at 
org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:182)
________at 
org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:284)
________at 
org.apache.axis.encoding.ser.ArrayDeserializer.valueComplete(ArrayDeserializer.java:533)
________at 
org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:541)
________at 
org.apache.axis.encoding.DeserializationContextImpl.endElement(DeserializationContextImpl.java:961)
________at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:206)
________at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:693)
________at 
org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:404)
________at 
org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeserializer.java:167)
________at 
org.apache.axis.encoding.DeserializationContextImpl.startElement(DeserializationContextImpl.java:925)
...

I checked the SOAP request and response via TCPMon, and everything looked 
kosher.

In my classpath for JUnit, I tried switching the order of:
* the directory for the WSDL2Java-generated client classes and
* the directory for the original server-side representations of these classes.
Same error with both orders.

One aside. I created a custom (de)serializer for the Parent class, because 
the standard bean (de)serializer was having trouble with the Child[] field. 
The above stack trace indicates that, on the client, the custom 
deserializer is not being used; the bean one is instead. However, that may 
also be true in the successful case of the Axis client being run directly.


Re: client classloader confusion

Posted by Mitch Gitman <mg...@usa.net>.
Just for the heck of it, I tried running junit.swingui.TestRunner with the 
-noloading argument. That worked, although I can't comprehend why, 
considering that running the Axis client directly had been working anyway.

My concern with -noloading -- expressed in the thread commons-logging issue 
(maybe JUnit-related) -- had been that, if I have JUnit run more than one 
test case, the second and later cases will fail because they are generating 
cumulative data on the Axis server based on preceding tests rather than 
fresh data based only on the current test.

So I added to my web service interface a purge() operation to re-initialize 
the server data structures in memory. Then my client calls purge at the 
start of each test case. To reiterate, this hack is only necessary if you 
are running a series of JUnit test cases, and each test case relies on 
having an Axis web service in a just-initialized state.


At 22:01 10.12.02 -0800, you wrote:
>I'm testing a method in my web service: public Parent addParent(String data)
>A Parent object contains an array of Child objects, accessible through the 
>Parent's: public Child[] getChildrenAsArray()
>
>When I run an Axis client directly and have it call my Axis server, this 
>call works fine. But when I run an Axis client launched through JUnit, I 
>get a weird, client-only error that the client can't convert a Child array 
>to itself:
>
>Dec 10, 2002 7:16:16 PM org.apache.axis.encoding.ser.BeanPropertyTarget set
>SEVERE: Could not convert [Lfoo.bar.Child; to bean field 
>'childrenAsArray', type [Lfoo.bar.Child;
>Dec 10, 2002 7:16:16 PM org.apache.axis.client.Call invoke
>SEVERE: Exception:
>java.lang.IllegalArgumentException: argument type mismatch
>________at 
>org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:182)
>________at 
>org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:284)
>________at 
>org.apache.axis.encoding.ser.ArrayDeserializer.valueComplete(ArrayDeserializer.java:533)
>________at 
>org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:541)
>________at 
>org.apache.axis.encoding.DeserializationContextImpl.endElement(DeserializationContextImpl.java:961)
>________at 
>org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:206)
>________at 
>org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:693)
>________at 
>org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:404)
>________at 
>org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeserializer.java:167)
>________at 
>org.apache.axis.encoding.DeserializationContextImpl.startElement(DeserializationContextImpl.java:925)
>...
>
>I checked the SOAP request and response via TCPMon, and everything looked 
>kosher.
>
>In my classpath for JUnit, I tried switching the order of:
>* the directory for the WSDL2Java-generated client classes and
>* the directory for the original server-side representations of these classes.
>Same error with both orders.
>
>One aside. I created a custom (de)serializer for the Parent class, because 
>the standard bean (de)serializer was having trouble with the Child[] 
>field. The above stack trace indicates that, on the client, the custom 
>deserializer is not being used; the bean one is instead. However, that may 
>also be true in the successful case of the Axis client being run directly.