我正在尝试使用基于axis2的网络服务中的Opentext Content Web Services(CWS)。
这是一段为CWS创建代理客户端并在标头中传递身份验证令牌的代码。
DocumentManagement_Service docManService = new DocumentManagement_Service();
DocumentManagement docManClient = docManService.getBasicHttpBindingDocumentManagement();
try
{
// The namespace of the OTAuthentication object
final String ECM_API_NAMESPACE = "urn:api.ecm.opentext.com";
// Create a SOAP header
SOAPHeader header = MessageFactory.newInstance().createMessage().getSOAPPart().getEnvelope().getHeader();
// Add the OTAuthentication SOAP header element
SOAPHeaderElement otAuthElement = header.addHeaderElement(new QName(ECM_API_NAMESPACE, "OTAuthentication"));
// Add the AuthenticationToken SOAP element
SOAPElement authTokenElement = otAuthElement.addChildElement(new QName(ECM_API_NAMESPACE, "AuthenticationToken"));
authTokenElement.addTextNode(authToken);
// Set the SOAP header on the docManClient
String ENDPOINT_ADDRESS_PROPERTY = WSBindingProvider.ENDPOINT_ADDRESS_PROPERTY;
((WSBindingProvider) docManClient).setOutboundHeaders(Headers.create(otAuthElement));
}
catch (SOAPException e)
{
System.out.println("Failed to set authentication SOAP header!\n");
System.out.println(e.getMessage());
System.out.println(e.getStackTrace());
return;
}
从简单的Java应用程序执行时,此代码工作正常。在这种情况下,docManClient是一个 SEIStub 对象, setOutboundHeaders 方法在转换为WSBindingProvider后可以正常工作。
但是当我的axis2 webservice中执行此代码时,docManClient是 JAXWSProxyHandler 对象,它不能被转换为WSBindingProvider,也不能执行setOutboundHeaders方法。
所以我的问题是 - 如何使用 JAXWSProxyHandler 传递我的头文件(与setOutBoundHeaders方法一样)或者我可以以某种方式将JAXWSProxyHandler对象转换为SEIStub对象吗?
答案 0 :(得分:2)
出现此问题是因为您正在使用特定于JRE中的JAX-WS实现的API。但是,在Axis2上运行时,将使用Axis2提供的JAX-WS实现。该实现支持一组不同的API扩展。
这意味着您的代码不能跨不同的JAX-WS实现移植。您有两种选择:
仅使用标准API使其可移植。在您的情况下,这将需要实现添加标头的JAX-WS处理程序。要将authToken传递给处理程序,您可以将客户端转换为BindingProvider
并将数据添加到请求上下文中。
从Axis2部署中删除axis2-jaxws
JAR,以便您的代码将使用JRE中的JAX-WS实现。当然,如果将服务本身部署为JAX-WS服务,这将不起作用。不幸的是,代码片段没有显示是否是这种情况。