Claus, Can you please submit a stripped down test that we can use to recreate the problem and log it as a bug in bugzilla?
Thanks, dims --- Claus Nyhus Christensen <[EMAIL PROTECTED]> wrote: > > Hi > > I am trying to create a simple handler which alters the content of the > SOPABody of an incoming SOAP message. > > The web service I am using is a simple "echo" web service with a single > method called echo. The methods takes a string and just returns it. > > The code for the handler is as follows: > > package com.trifork.eas.test.webservices.echoservice; > > import java.io.*; > import java.io.InputStream; > import java.util.*; > import java.util.Iterator; > > import javax.xml.namespace.QName; > import javax.xml.rpc.handler.*; > import javax.xml.rpc.handler.soap.SOAPMessageContext; > import javax.xml.soap.*; > import javax.xml.soap.SOAPMessage; > import javax.xml.transform.stream.*; > > /** > * Created: Jan 20, 2003 > * > * @author Claus Nyhus Christensen <[EMAIL PROTECTED]> > */ > public class EchoServiceServerHandler implements Handler { > > public boolean handleRequest(MessageContext messageContext) { > > try { > SOAPMessageContext soapMsgCtx = (SOAPMessageContext) > messageContext; > SOAPMessage soapMsg = soapMsgCtx.getMessage(); > SOAPPart soapPart = soapMsg.getSOAPPart(); > SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); > soapEnvelope.getBody().detachNode(); > SOAPBody soapBody = soapEnvelope.addBody(); > SOAPBodyElement echoElement = > soapBody.addBodyElement(soapEnvelope.createName("echo", "ns1", > "http://soapinterop.org/")); > SOAPElement argElement = echoElement.addChildElement("arg0"); > argElement = > argElement.addAttribute(soapEnvelope.createName("type", "xsi", > "http://www.w3.org/2001/XMLSchema-instance"), "xsd:string"); > argElement.addTextNode("a new string"); > soapMsg.saveChanges(); > > } catch (Exception e) { > e.printStackTrace(); > } > > return true; > } > > ... > > } > > Now, when my client tries to call the web service, I get the following > exception: > > AxisFault > faultCode: > {http://schemas.xmlsoap.org/soap/envelope/}Server.userException > faultSubcode: > faultString: java.lang.Exception: No deserialization context to use in > MessageElement.getValueAsType()! > faultActor: null > faultNode: null > faultDetail: > stackTrace: java.lang.Exception: No deserialization context to > use in > MessageElement.getValueAsType()! > at > org.apache.axis.message.MessageElement.getValueAsType(MessageElement.java:544) > at > org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:150) > at > org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:332) > at > org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:71) > at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:156) > at org.apache.axis.SimpleChain.invoke(SimpleChain.java:126) > at > org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:469) > at org.apache.axis.server.AxisServer.invoke(AxisServer.java:326) > at > org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:782) > .... > > I have been looking into the code, and it seems that the way the > original SOAPBody is build is different from the way it is done when you > use the JAXM methods on the SOAPBody class. > > I have tried the same example using the JAXRPC/SAAJ reference > implementations and it works just fine there. > > To me it seems that: > > 1. I am doing something completely wrong in my handler > or > 2. The addBodyElement on the SOAPBody class is not working as is should > > If you agree with me that number 2 is the case, I would like to help > create a fix. But I cannot figure out how I am going to be able to get a > DeserializationContext in the SOAPBody class. > > A related problem occur if you use the addChildElement on SOAPBody > instead of addBodyElement. When you do this a new MessageElement is > added to the SOAPBody. However, this will result in a ClassCastException > in the processMessage of the RPCProvider class. Line 141 and 142 gives > the problem: > if (!(bodies.get(bNum) instanceof RPCElement)) { > SOAPBodyElement bodyEl = (SOAPBodyElement)bodies.get(bNum); > > Since the MessageElement is not an instance of RPCElement, it is cast to > a SOAPBodyElement. This will result in the ClassCastException. This case > also works fine on the JAXRPC/SAAJ reference implementation. > > The fix seems to be to overwrite the addChildElement methods in SOAPBody > (which it inherits from MessageElement) to make sure that > SOAPBodyElements (or maybe RPCElement) are always added. However, this > fix will have the same problem with the DeserializationContext as stated > above. > > > I hope this mail was not to long, and was posted to the right > mailinglist :) > > Cheers > > -- > Claus Nyhus Christensen > Software Engineer, M. Sc. CS. > > Trifork, Margrethepladsen 3, DK-8000 ?rhus C, Denmark > Phone: +45 8732 8787 / Fax: +45 8732 8788 / http://www.trifork.com > > ===== Davanum Srinivas - http://xml.apache.org/~dims/ __________________________________________________ Do you Yahoo!? Yahoo! Mail Plus - Powerful. Affordable. Sign up now. http://mailplus.yahoo.com