I forgot to mention that I am on 2.7.15.

Gary

On Mon, Apr 20, 2015 at 6:50 PM, Gary Gregory <[email protected]>
wrote:

> Hi All:
>
> We have an app server that uses org.apache.cxf.endpoint.Client to call
> various third party services.
>
> We are now dealing with a new WSDL which requires an element and child
> element in the SOAP header for each invocation (a session header element
> and a sesssion ID child element).
>
> The SOAP has to look like this:
>
> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
> xmlns:urn="urn:app.example.com">
>    <soapenv:Header>
>       <urn:SessionHeader>
>          <urn:sessionId>ABC-Session-ID-XYZ</urn:sessionId>
>       </urn:SessionHeader>
>    </soapenv:Header>
>    <soapenv:Body>
>       <urn:SomeName/>
>       ...
>    </soapenv:Body>
> </soapenv:Envelope>
>
> This FAQ item is a helpful start:
> http://cxf.apache.org/faq.html#FAQ-HowcanIaddsoapheaderstotherequest/response
> ?
>
> Because our services are dynamic, I do not know at development time what
> the header name or structure is, so I need to fetch it out of CXF's model
> and create the SOAP headers programatically based on our server's input
> which has its own object model.
>
> I create a Client out a WSDL and a JaxWsDynamicClientFactory. Then I can
> do:
>
>         final Endpoint endpoint = client.getEndpoint();
>         final BindingInfo binding = endpoint.getBinding().getBindingInfo();
>         final BindingOperationInfo boi = binding.getOperation(new
> QName(namespace, bindingOperation));
>         final BindingMessageInfo inputMessageInfo = boi.getInput();
>         final List<MessagePartInfo> parts =
> inputMessageInfo.getMessageParts();
>         final MessagePartInfo partInfo = parts.get(0); // only one part.
>         final Class<?> partClass = partInfo.getTypeClass();
>         final Object[] operationArguments = buildArguments(..., partClass);
>         List<Header> headers = new ArrayList<Header>();
>         ...?...
>         client.getRequestContext().put(Header.HEADER_LIST, headers);
>         if (boi.isUnwrapped()) {
>             result = client.invoke(bindingOperation, operationArguments);
>         } else {
>             result = client.invokeWrapped(bindingOperation,
> operationArguments);
>         }
>
> How do I get the SOAP header part of the WSDL from CXF's model? In WSDL
> it's the input's soap:header element:
>
>   <operation name="SomeName">
>    <soap:operation soapAction=""/>
>    <input>
>     <soap:header message="tns:Header" part="SessionHeader" use="literal"/>
>     <soap:body use="literal" parts="parameters"/>
>    </input>
>    <output>
>     <soap:body use="literal"/>
>    </output>
>   </operation>
>
> It looks like I can get to all the other bits of the WSDL from
> endpoint.getBinding().
>
> Thoughts?
>
> Thank you,
> Gary
>
> --
> E-Mail: [email protected] | [email protected]
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
E-Mail: [email protected] | [email protected]
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to