【问题标题】:CXF: add SOAP header to requestCXF:向请求添加 SOAP 标头
【发布时间】:2016-04-10 18:46:25
【问题描述】:

我尝试通过BindingProvider.getRequestContext().put(Header.HEADER_LIST, headers) 将 SOAP 标头添加到我的请求中,但缺少 SOAP 标头。我的代码如下:

CXF生成的标准WebService类:

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

CXF生成的标准WebServiceClient类

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

发送我的请求的类:

@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 正文:

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

我不知道出了什么问题。 感谢您的建议。

【问题讨论】:

    标签: cxf soapheader


    【解决方案1】:

    获取正确 ctx 图的另一种方法如下:

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

    【讨论】:

      【解决方案2】:

      现在我直接使用 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);
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多