CXF:向请求添加SOAP标头

CXF:向请求添加SOAP标头

问题描述:

我试图通过BindingProvider.getRequestContext().put(Header.HEADER_LIST, headers)将SOAP标头添加到我的请求中,但SOAP标头缺失。我的代码是这样的:CXF:向请求添加SOAP标头

标准的WebService通过CXF生成的类:通过CXF

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

类生成

@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 
    ); 
} 

标准WebServiceClient此类类,它发送我的请求:

@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; 
} 

它生成正确的请求,但SOAP标题丢失。该请求仅包含SOAP Body:

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

我不知道什么是错的。 感谢您的任何建议。

现在我直接使用WebService(MyService),而不是从WebServiceClient获取它,它可以工作。我的send方法看起来像:

@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); 
}