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