How to provide soapAction from dispatch call?
oskar.carlstedt Apr 16, 2007 11:44 AMHello!
I've tried a to fix this for some hours know. Maybe I'm doing something completely wrong here.
I have a web service client that that is using the dispatch technique. I will use the dispatch because I'm using xmlbeans to bind my data. Here is a little code snippet of what I'm trying to do:
// names String targetNamespace = "http://test/test-service"; QName serviceQName = new QName(targetNamespace, "TestService"); QName portQName = new QName(targetNamespace, "TestServiceSoap11Port"); URL wsdlURL = new URL("http://lpt-osca:8080/service-testservice-jaxws-web?wsdl"); // create service Service service = Service.create(serviceQName); service.addPort(portQName, SOAPBinding.SOAP11HTTP_BINDING, wsdlURL.toExternalForm()); Dispatch<StreamSource> dispatch = service.createDispatch(portQName, StreamSource.class, Mode.PAYLOAD); // set SOAPAction dispatch.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, true); dispatch.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, "uri:placeBuyOrder"); // create xml options for pretty print XmlOptions xmlOptions = new XmlOptions(); xmlOptions.setSavePrettyPrint(); // create request TestRequestDocument testRequestDocument = TestRequestDocument.Factory.newInstance(); ... // print request System.out.println("REQUEST"); testRequestDocument.save(System.out, xmlOptions); System.out.println(); // save request in a stream ByteArrayOutputStream requestByteArrayOutputStream = new ByteArrayOutputStream(); testRequestDocument.save(requestByteArrayOutputStream); // create a new stream source StreamSource requestStreamSource = new StreamSource(new ByteArrayInputStream(requestByteArrayOutputStream.toByteArray())); // invoke StreamSource responseSource = dispatch.invoke(requestStreamSource); // parse result XmlObject xmlObject = XmlObject.Factory.parse(responseSource.getInputStream()); // print response System.out.println("RESPONSE"); xmlObject.save(System.out, xmlOptions);
When doing this. it seems like the soap action attribute is not sent to the server, at least not in the http headers. So, my question is: Is the soapAction sent to the sever? If so, where can I find it in the messageContext?
My service is a web service endpoint provider implementation like
@Stateless @WebServiceProvider( serviceName = "TestService", portName = "TestServiceSoap11Port", targetNamespace = "http://test/test-service", wsdlLocation = "WEB-INF/wsdl/test-service.wsdl") @ServiceMode(value = Service.Mode.PAYLOAD) public class FundOrderEndpointProvider implements Provider<Source> { ... }
I will look for the soap action http header to decide what method to invoke in another stateless session bean.
Can anyone help me we this?
Best Regards
Oskar