0

I tried to add SOAP header to my request via BindingProvider.getRequestContext().put(Header.HEADER_LIST, headers) but the SOAP Header is missing. My code is like the following:

Standard WebService class generated by CXF:

@WebService(targetNamespace = "...", name = "...")
@XmlSeeAlso({...ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface MyService {
    ... 
    @WebMethod(operationName = "...")
    public Future<?> sendAsync(
        @WebParam(partName = "parameters", name = "...", targetNamespace = "...")
        MyRequestMessageType parameters,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<MyResponseMessageType> asyncHandler
    );
}

Standard WebServiceClient class generated by CXF

@WebServiceClient(name = "...", wsdlLocation = "...", targetNamespace = "...") 
public class MyService_Service extends Service {
    ...
    @WebEndpoint(name = "...")
    public MyService getVendorManagementService() {
        return super.getPort(MY_SERVICE, MyService.class);
    }
}

Class which sends my request:

@Inject
private MyService_Service myService;

public void send() {        
    BindingProvider port = (BindingProvider) myService.getWebEndpointPort(); 
    port.getRequestContext().put("thread.local.request.context", "true");

    List<Header> headers = getHeaders(port.getRequestContext());
    Header messageIDHeader = new Header(new QName("http://www.w3.org/2005/08/addressing", "MessageID", "wsa"), "some_id", new JAXBDataBinding(String.class));
    headers.add(messageIDHeader);
    port.getRequestContext().put(Header.HEADER_LIST, headers);        

    MyRequestMessageType message = messageCreator.createMyRequestMessage();
    MyAsyncHandler asyncHandler = new MyAsyncHandler();
    ((MyService) port).sendAsync(message, asyncHandler);
}

private static List<Header> getHeaders(Map<String, Object> messageContext) {
    if (messageContext == null) {
        return null;
    }
    List<Header> headers = CastUtils.cast((List<?>) messageContext.get(Header.HEADER_LIST));
    if (headers == null){
        return new ArrayList<Header>();
    }
    return headers;
}

It generates correct request but SOAP Header is missing. The request contains only SOAP Body:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
  ... the message is OK
  </soap:Body>
</soap:Envelope>

I have no idea what is wrong. Thanks for any advice.

Fenix
  • 2,271
  • 1
  • 16
  • 24

2 Answers2

1

Another way to get the right ctx map is the following:

org.apache.cxf.endpoint.Client p = 
  org.apache.cxf.frontend.ClientProxy.getClient(myService);
Map<String, Object> ctx = p.getRequestContext();
ctx.put(Header.HEADER_LIST, headers);
ntucci
  • 63
  • 1
  • 8
0

Now I use WebService (MyService) directly instead of getting it from WebServiceClient and it works. My send method looks like:

@Inject
private MyService port;

public void send() {
    ((BindingProvider) port).getRequestContext().put("thread.local.request.context", "true");

    List<Header> headers = getHeaders(((BindingProvider) port).getRequestContext());
    Header messageIDHeader = new Header(new QName("http://www.w3.org/2005/08/addressing", "MessageID", "wsa"), "some_id", new JAXBDataBinding(String.class));
    headers.add(messageIDHeader);
    ((BindingProvider) port).getRequestContext().put(Header.HEADER_LIST, headers);        

    MyRequestMessageType message = messageCreator.createMyRequestMessage();
    MyAsyncHandler asyncHandler = new MyAsyncHandler();
    port.sendAsync(message, asyncHandler);
}
Fenix
  • 2,271
  • 1
  • 16
  • 24