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