You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Guillaume Sauthier <Gu...@objectweb.org> on 2004/10/28 14:41:32 UTC

Missing TypeMapping removal when undeploy service ?

Hi all,

I saw in axis sources that when we deploy a service, there are several 
things done. One of them is to register type mapping.
When a service a undeployed, reverse things as done except unregistering 
type mapping.

The scenario is the following :
I create a ClassLoader for each service I deploy (contains the Bean A 
class), so deploying a service for the first will create a new 
ClassLoader (say CL_1), Axis Admin class will merge my deploy.wsdd into 
the registry and load my described Beans (say A loaded from CL_1).
But if I undeploy the service, TypeMapping is not changed, not removed 
(we're stuck with Bean A from CL1).
To finish, I redeploy the same service (creating a new ClassLoader 
(CL_B)), but TypeMapping for the service is not changed (Bean A from 
CL_1). And the following error comes when I call the deployed service, 
while deserializing Bean A : DeserializerImpl has created the right 
object instance (Bean A from CL_2) but the setter/getter method invoked 
come from Bean A from CL_1 !!! And thus, that causes the following 
IllegalArgumentException !!!

Is this a Bug in Axis ? I think this problem could be resolved if 
undeployment of services removed the typeMapping too !
I think that this correction should not break any existing applications ...

Here is the StackTrace :

2004-10-28 11:34:58,762 : BeanPropertyTarget.set : Could not convert 
java.lang.Integer to bean field 'areaCode', type int
2004-10-28 11:34:58,795 : AxisServlet.processAxisFault : AxisFault:
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.IllegalArgumentException: object is not an 
instance of declaring class
faultActor:
faultNode:
faultDetail:
     
{http://xml.apache.org/axis/}stackTrace:java.lang.IllegalArgumentException: 
object is not an instance of declaring class
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

     at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

     at java.lang.reflect.Method.invoke(Method.java:324)
     at 
org.apache.axis.utils.BeanPropertyDescriptor.set(BeanPropertyDescriptor.java:117) 

     at 
org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:89) 

     at 
org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:248) 

     at 
org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:511) 

     at 
org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1077) 

     at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165) 

     at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:845) 

     at 
org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:371) 

     at 
org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1038) 

     at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:159) 

     at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:845) 

     at 
org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:371) 

     at 
org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeserializer.java:130) 

     at 
org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1038) 

     at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:159) 

     at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:845) 

     at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:198)
     at org.apache.axis.message.RPCElement.getParams(RPCElement.java:323)
     at 
org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:146) 

     at bpel.engine.BPELProvider.processMessage(BPELProvider.java:109)
     at 
org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:319)
     at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 

     at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
     at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
     at 
org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:455)
     at org.apache.axis.server.AxisServer.invoke(AxisServer.java:285)
     at 
org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:637)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
     at 
org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:301) 

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
 ...


Regards
Charles & Guillaume

Re: Missing TypeMapping removal when undeploy service ?

Posted by Davanum Srinivas <da...@gmail.com>.
Yes, this is a bug/feature. I think the problem is that we don't keep
track of which mappings were added for which service. So it's
difficult to distinguish between the global mappings and service
specific mappings. Am +1 to include this enhancement (as long as you
are willing to help fix it by submitting a patch :).

-- dims


On Thu, 28 Oct 2004 14:41:32 +0200, Guillaume Sauthier
<gu...@objectweb.org> wrote:
> Hi all,
> 
> I saw in axis sources that when we deploy a service, there are several
> things done. One of them is to register type mapping.
> When a service a undeployed, reverse things as done except unregistering
> type mapping.
> 
> The scenario is the following :
> I create a ClassLoader for each service I deploy (contains the Bean A
> class), so deploying a service for the first will create a new
> ClassLoader (say CL_1), Axis Admin class will merge my deploy.wsdd into
> the registry and load my described Beans (say A loaded from CL_1).
> But if I undeploy the service, TypeMapping is not changed, not removed
> (we're stuck with Bean A from CL1).
> To finish, I redeploy the same service (creating a new ClassLoader
> (CL_B)), but TypeMapping for the service is not changed (Bean A from
> CL_1). And the following error comes when I call the deployed service,
> while deserializing Bean A : DeserializerImpl has created the right
> object instance (Bean A from CL_2) but the setter/getter method invoked
> come from Bean A from CL_1 !!! And thus, that causes the following
> IllegalArgumentException !!!
> 
> Is this a Bug in Axis ? I think this problem could be resolved if
> undeployment of services removed the typeMapping too !
> I think that this correction should not break any existing applications ...
> 
> Here is the StackTrace :
> 
> 2004-10-28 11:34:58,762 : BeanPropertyTarget.set : Could not convert
> java.lang.Integer to bean field 'areaCode', type int
> 2004-10-28 11:34:58,795 : AxisServlet.processAxisFault : AxisFault:
> AxisFault
> faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> faultSubcode:
> faultString: java.lang.IllegalArgumentException: object is not an
> instance of declaring class
> faultActor:
> faultNode:
> faultDetail:
> 
> {http://xml.apache.org/axis/}stackTrace:java.lang.IllegalArgumentException:
> object is not an instance of declaring class
>      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>      at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> 
>      at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> 
>      at java.lang.reflect.Method.invoke(Method.java:324)
>      at
> org.apache.axis.utils.BeanPropertyDescriptor.set(BeanPropertyDescriptor.java:117)
> 
>      at
> org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:89)
> 
>      at
> org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:248)
> 
>      at
> org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:511)
> 
>      at
> org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1077)
> 
>      at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
> 
>      at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:845)
> 
>      at
> org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:371)
> 
>      at
> org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1038)
> 
>      at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:159)
> 
>      at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:845)
> 
>      at
> org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:371)
> 
>      at
> org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeserializer.java:130)
> 
>      at
> org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1038)
> 
>      at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:159)
> 
>      at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:845)
> 
>      at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:198)
>      at org.apache.axis.message.RPCElement.getParams(RPCElement.java:323)
>      at
> org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:146)
> 
>      at bpel.engine.BPELProvider.processMessage(BPELProvider.java:109)
>      at
> org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:319)
>      at
> org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
> 
>      at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
>      at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
>      at
> org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:455)
>      at org.apache.axis.server.AxisServer.invoke(AxisServer.java:285)
>      at
> org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:637)
>      at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
>      at
> org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:301)
> 
>      at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
>  ...
> 
> Regards
> Charles & Guillaume
> 


-- 
Davanum Srinivas - http://webservices.apache.org/~dims/