Search code examples
javacxfws-addressingreference-parameters

How to add wsa reference parameters to cxf client call?


I understand how to simply add the "standard" ws addressing headers to a cxf client call:

JaxWsProxyFactoryBean factory = ...;
factory.getFeatures().add(new WSAddressingFeature());

But I don't understand exactly how I could add wsa reference parameters so that the soap header of the message looks like this:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsa="http://www.w3.org
/2005/08 /addressing" xmlns:ns1=... >
<soap:Header>
  <wsa:To>...</wsa:To>
  <wsa:Action>...</wsa:Action>
  <wsa:MessageID>...</wsa:MessageID>
  <ns1:Country wsa:IsReferenceParameter="true">xx</ns1:Country>
  <ns1:Brand wsa:IsReferenceParameter="true">x</ns1:Brand>
</soap:Header> ...

How can I add this headers within a cxf client call?

kind regards, soilworker


Solution

  • This could be done with help of AddressingProperties.

    factory.setServiceClass(...);
    factory.setAddress(...);
    factory.getFeatures().add(new WSAddressingFeature());
    SomePortType client = (SomePortType) factory.create();
    AddressingProperties maps = new AddressingPropertiesImpl();
    EndpointReferenceType epr = new EndpointReferenceType();
    
    //Then you can add referenceParameters to the epr
    ReferenceParametersType ref = new ReferenceParametersType();
    List<Object> paras = ref.getAny();
    Country ctry = new Country("xx");
    
    JAXBContext ctx = JAXBContext.newInstance(new Class[] {Country.class });
    Marshaller marshaller = ctx.createMarshaller();
    DOMResult res = new DOMResult();
    marshaller.marshal(ctry, res);
    Element elt = ((Document) res.getNode()).getDocumentElement();
    any.add(elt);
    
    epr.setReferenceParameters(ref);
    maps.setTo(epr);
    
    ((BindingProvider)client).getRequestContext()
        .put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES, maps);
    

    Reference: cxf doc about ws-addr (I cannot post more links, sigh..) and http://cxf.547215.n5.nabble.com/setting-reference-parameters-in-WS-Addressing-header-td3257262.html
    I'm not familiar with JAXB, and I think their could be better way to add parameters to ref.