8

All, I'm attempting to write a Junit test that calls a Web Service client in Axis2.1.5, and I've gotten confused about how to exactly to set it up to use WS-Addressing.

I've generated a client stub using wsdl2java, and I'm using the axis2.xml and modules repository from the axis2 binary distribution.

I know I need to use the MemberSubmission version of the WS-Addressing, and I think I've got that set up correctly (using Options), but the headers don't seem to get generated correctly. (I say 'seem' because I can't figure out how to the SOAPMonitor module working either - I'd welcome any tips on that too!).

My main confusion, though, is around what exactly it takes to 'engage' the Addressing module. Should it be enough to set up my ConfigurationContext with an axis2.xml file that has a reference to the addressing module? Like this? :

//standard out of the box axis2 configs
 ConfigurationContext myConfigContext = ConfigurationContextFactory
   .createConfigurationContextFromFileSystem("C:/devapps/axis2-1.5.1/repository","C:/devapps/axis2-1.5.1/conf/axis2.xml");

  Options options = new Options();
  EndpointReference targetEPR = new EndpointReference(
    "https://host:port/service.asmx");

  options.setTo(targetEPR);

                //I believe this is what I'm supposed to do to specify the 
  //MemberSubmission version of WS-Addressing
  options.setProperty(AddressingConstants.WS_ADDRESSING_VERSION,
    AddressingConstants.Submission.WSA_NAMESPACE);
  //No idea of this is needed or not.
  options.setProperty(AddressingConstants.INCLUDE_OPTIONAL_HEADERS,
    Boolean.TRUE);
  options.activate(myConfigContext);
  options.setAction("someAction");

  CaseDetailsServiceStub stub = new CaseDetailsServiceStub(
    "https://host:port/service.asmx");
  stub._getServiceClient().setOptions(options);

  //I'm calling this from a Junit test
  assertNotNull(stub.someAction(someParam));

With my options set up like above, is see in the log file that the modules are getting loaded from axis2.xml:

[INFO] Deploying module: addressing-1.5.1 - file:/C:/devapps/axis2-1.5.1/repository/modules/addressing-1.5.1.mar

But I don't think I'm getting any addressing headers. The error I get back from the server at this point says:

Header http://schemas.xmlsoap.org/ws/2004/08/addressing:Action for ultimate recipient is required but not present in the message.

So, I've also seen some documents reference 'engaging' modules. When I try to add this line to my code and add the addressing-1.5.1.mar to my classpath, though:

stub._getServiceClient().engageModule("addressing");

I get an error that says:

Unable to engage module : addressing org.apache.axis2.AxisFault: Unable to engage module : soapmonitor at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:358)

No other info or stack trace in the logs beyond, that, though, so I'm confused.

Any ideas on what I'm doing wrong?

elduff
  • 1,178
  • 3
  • 14
  • 22
  • Thanks for asking this question, it helped me a lot. For those who might use this code as an example I'd like to point out that elduff has used the Submission version of the WSA-namespace. The final namespace is available through AddressingConstants.Final.WSA_NAMESPACE. This was relevant to me as I tried to create a client for a JAX-WS 2.1 (Metro) server using Axis 2 1.5.1. and the client kept complaining that WSA-headers were missing. The problem was caused by using Submission.WSA_NAMESPACE in the client as the server used Final.WSA_NAMESPACE. – Aleksi Yrttiaho May 17 '10 at 05:56

3 Answers3

7

put addressign.mar and sopamoniter.mar into lib or classpath of project . it works for me find the mar from axis2 kit

deepak
  • 86
  • 2
  • Hi Deepak, Can you please tell in which operating system you did this fix? I am facing this issue in Linux OS (Test environment) and not in Windows (Development environment) – Vijay Krish Apr 20 '16 at 16:59
4

In my Maven project, I had to declare an additional dependency on the org.apache.axis2:addressing artifact:

<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>addressing</artifactId>
    <version>1.6.2</version>
    <classifier>classpath-module</classifier>
</dependency>
MyServiceStub stub = new MyServiceStub(targetEndpoint);
stub._getServiceClient().engageModule("addressing");

I don't see any classpath-module artifacts for SoapMonitor on Maven Central, though.

Ben Hutchison
  • 4,823
  • 4
  • 26
  • 25
0

Address can be added directly to Soap Header.

SOAPHeader soapHeader = soapEnvelope.getHeader();
soapHeader.declareNamespace("http://www.w3.org/2005/08/addressing", "wsa");
csalmhof
  • 1,820
  • 2
  • 15
  • 24
Prabhu
  • 76
  • 2
  • 6