Steve Smith wrote:
I have a simple servlet which reads in a soap message, parses the XML payload and attempts to add a single element to the existing (soap message just read in)soap message. I receive the soap message (from client) and display the elements to log file - no problem. However, when I add an element to the soap message and return the message the change does not take place. It's as if I never changed the message. Can I modify the soap message I just read? Do I have to recreate a new message from scratch or is there something I'm missing? The servlet code is below. Thanks for any help.
SLS
------------------
// // ModifySoapMsgService.java // // This program reads a SOAP message and returns a modify version of // the same // message back to the client application (requester). // // // Build Instructions: // o set classpath= <tomcat path>\common\lib\servlet.jar // o javac ModifySoapMsgService.java // o Copy ModifySoapMsgService.class file to // <your web apps path>\MyWsApps\WEB-INF\classes // o Call from client application (ModifySoapMsgClient). //
/* Servlet related packages. */ import javax.servlet.*; // Generic servlet package. import javax.servlet.http.*; // Web server extensions to encapsulate HTTP communication.
/* SOAP related packages. */ import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPBody; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPException; import javax.xml.soap.Name; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPElement;
/* Other needed packages. */ import java.io.*; import java.util.Iterator;
public class ModifySoapMsgService extends HttpServlet{ private static MessageFactory myMsgFactory;
/* Create static instance of message factory. */ static{ try { /* Create a new message factory. */ myMsgFactory = MessageFactory.newInstance();
}catch(SOAPException e){ System.out.println("Caught Exception: " + e.getMessage()); } }
public void init(ServletConfig servletConfig) throws ServletException{ super.init(servletConfig); // Initialize servlet w/config info passed by Tomcat. }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ SOAPMessage mySoapMsg;
System.out.println("\n\nModifySoapMsgSerice.doPost() - Received SOAP message..."); log("doPost() ..."); try{ InputStream myInputStream = request.getInputStream(); OutputStream myOutputStream = response.getOutputStream();
log("o Reading SOAP message ..."); /* Create SOAP message from SOAP content (sent by client) of input stream. */ mySoapMsg = myMsgFactory.createMessage(new MimeHeaders(),myInputStream);
/* Process SOAP message. */ SOAPMessage reply=null; reply = onMessage(mySoapMsg);
/* Return modified SOAP message. */ System.out.println("ModifySoapMsgSerice.doPost() - Return results..."); reply.saveChanges(); reply.writeTo(myOutputStream); myOutputStream.flush(); }catch(Exception e){ throw new ServletException("doPost failed: " + e.getMessage()); } }
public SOAPMessage onMessage(SOAPMessage inSoapMsg){ SOAPPart mySoapPart; SOAPEnvelope mySoapEnvelope; SOAPHeader mySoapHeader; SOAPBody mySoapBody; SOAPBodyElement myAppFormElement; SOAPElement myApplicantElement; SOAPElement myNameElement; SOAPElement myAddressElement; SOAPElement myPhoneNoElement; SOAPElement myAgeElement; SOAPElement myBeneficiaryElement; Iterator myElementIterator; // Create iterator for child elements. Name myElementName; String nsUri = "http://ltree.com/app"; String nsPrefix = "lt"; ByteArrayOutputStream myByteArray = new ByteArrayOutputStream();
System.out.println("ModifySoapMsgSerice.onMessage() - Processing SOAP message..."); log("doMessage() ...");
try{ /* Log SOAP message just read in. */ inSoapMsg.writeTo(myByteArray); log("o inSoapMsg: " + myByteArray.toString());
/* Get SOAP part from message. */ mySoapPart = inSoapMsg.getSOAPPart();
/* Get envelope from SOAP part. */ mySoapEnvelope = mySoapPart.getEnvelope();
/* Get header from SOAP envelope. */ mySoapHeader = mySoapEnvelope.getHeader();
/* Get body from envelope. */ mySoapBody = mySoapEnvelope.getBody();
/* * Parse message body. * * <lt:AppForm term="life" xmlns:lt="http://ltree.com/app"> * <lt:Applicant> * <lt:Name>Pat Brown</lt:Name> * <lt:Address>123 Main St</lt:Address> * <lt:PhoneNo>123-4567</lt:PhoneNo> * </lt:Applicant> * <lt:Beneficiary>Dale Brown</lt:Beneficiary> * </lt:AppForm> */ /* - Get <AppForm> element. */ myElementName = mySoapEnvelope.createName("AppForm",nsPrefix,nsUri); // Creates element name. myElementIterator = mySoapBody.getChildElements(myElementName); // Get child element iterator. myAppFormElement = (SOAPBodyElement)myElementIterator.next(); // Get <AppForm> element. log("o Read <" + myAppFormElement.getElementName().getLocalName() + "> element");
/* - Get <Applicant> element of <AppForm>. */ myElementName = mySoapEnvelope.createName("Applicant",nsPrefix,nsUri); myElementIterator = myAppFormElement.getChildElements(myElementName); // Get child element iterator. myApplicantElement = (SOAPElement)myElementIterator.next(); // Get <Applicant> element. log("o Read <" + myApplicantElement.getElementName().getLocalName() + "> element");
/* - Get <Name> element of <Applicant>. */ myElementName = mySoapEnvelope.createName("Name",nsPrefix,nsUri); myElementIterator = myApplicantElement.getChildElements(myElementName); // Get child element iterator. myNameElement = (SOAPElement)myElementIterator.next(); // Get <Name> element. log("o Read <" + myNameElement.getElementName().getLocalName() + "> element"); log(" - <Name> value: " + myNameElement.getValue());
/* - Get <Address> element of <Applicant>. */ myElementName = mySoapEnvelope.createName("Address",nsPrefix,nsUri); myElementIterator = myApplicantElement.getChildElements(myElementName); // Get child element iterator. myAddressElement = (SOAPElement)myElementIterator.next(); // Get <Address> element. log("o Read <" + myAddressElement.getElementName().getLocalName() + "> element"); log(" - <Address> value: " + myAddressElement.getValue());
/* - Get <PhoneNo> element of <Applicant>. */ myElementName = mySoapEnvelope.createName("PhoneNo",nsPrefix,nsUri); myElementIterator = myApplicantElement.getChildElements(myElementName); // Get child element iterator. myPhoneNoElement = (SOAPElement)myElementIterator.next(); // Get <PhoneNo> element. log("o Read <" + myPhoneNoElement.getElementName().getLocalName() + "> element"); log(" - <PhoneNo> value: " + myPhoneNoElement.getValue());
/* - Get <Beneficiary> element of <AppForm>. */ myElementName = mySoapEnvelope.createName("Beneficiary",nsPrefix,nsUri); myElementIterator = myAppFormElement.getChildElements(myElementName); // Get child element iterator. myBeneficiaryElement = (SOAPElement)myElementIterator.next(); // Get <Beneficiary> element. log("o Read <" + myBeneficiaryElement.getElementName().getLocalName() + "> element"); log(" - <Beneficiary> value: " + myBeneficiaryElement.getValue());
/* * Modify message body. */ /* - Add <Age> sub-element "<lt:Age>32</lt:Age>" to <Applicant>. */ myElementName = mySoapEnvelope.createName("Age",nsPrefix,nsUri); myAgeElement = myApplicantElement.addChildElement(myElementName); myAgeElement.addTextNode("32");
inSoapMsg.saveChanges();
log("o <Age> element: " + myAgeElement.getValue()); myByteArray.reset(); inSoapMsg.writeTo(myByteArray); log("o inSoapMsg: " + myByteArray.toString());
}catch(Exception e){ System.out.println("Caught Exception: " + e.getMessage()); }
return inSoapMsg; }
}
