[jboss-user] [JBossWS] - Re: Duplicate SOAP body/envelope tags in SOAP message
jopere
do-not-reply at jboss.com
Thu Jun 7 17:03:36 EDT 2007
I succeeded in calling a web service, from a web service. However, I'd really like someone out there who knows what they are doing to show me how to do this correctly. I am sure there is a better way than what I did.
This is how I got it to work:
1. Create web service B as a stateless session bean web service using wstools to create artifacts (ejb 2.1). Deployed web service.
2. Create web service A as a stateless session bean using wscompile to generate web service artifacts. Copied WSDL from web service B and used wscompile to create client artifacts. However, I don't ever use the generated stub/service/serializer classes, because when I do, I get a SOAP message with duplicate body/envelope tags. What I do is create my own SOAP message using a SOAPMessageFactory. Then I added namespacese, attributes and elements to the message so it complies with the WSDL. Next I create a connection and call the web service. When the message returns I parse it, retrieve the return value and pass it back to the client.
3. Create a web client that calls web service A. Web service A calls web service B, which returns a value to A, which returns a value to the client.
So, web service A is both a server to the web client and a client to web service B. Web service A recieves the SOAP message from the web client and immediately calls web service B. Here is the code in web service A that calls web service B:
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection connection = scf.createConnection();
MessageFactory msgFactory = MessageFactory.newInstance();
// Create a message
SOAPMessage msg = msgFactory.createMessage();
// Create an envelope in the message
SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
// Bind ns0 namespace
envelope.addNamespaceDeclaration("ns0","http://aaa/bbb/1.0");
// Get hold of the the body
SOAPBody body = envelope.getBody();
body.addChildElement(envelope.createName("ns0:getGreeting", "", ""))
.addAttribute(envelope.createName("ns0"), "http://aaa/bbb/1.0");
URL endpoint = new URL("http://localhost:8082/ws/getGreeting");
msg.saveChanges();
// Make call to web service
SOAPMessage soapMessage = connection.call(msg, "http://localhost:8082/ws/getGreeting");
soapMessage.writeTo(System.out);
// The return value is in the grandchild element to the body tag.
Iterator it = soapMessage.getSOAPBody().getChildElements();
SOAPElement child = it.next();
Iterator it2 = child.getChildElements();
SOAPElement result = it2.next();
responseMessage = result.getValue();
As I said, there has to be an easier way to do this. If someone could show me a simpler way to call a web service from a web service, I'd appreciate it.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4052309#4052309
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4052309
More information about the jboss-user
mailing list