我正在尝试从基于axis2的web服务中使用opentext内容web服务(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方法相同)通过authelement传递头,或者如何将jaxwsproxyhandler对象转换为seistub对象?
1条答案
按热度按时间uelo1irk1#
出现此问题的原因是,您使用的api特定于jre中的jax-ws实现。但是,在axis2上运行时,将使用axis2提供的jax ws实现。该实现支持一组不同的api扩展。
这意味着您的代码不能跨不同的jax-ws实现进行移植。您有两种选择:
通过只使用标准API使其可移植。在您的例子中,这将需要实现一个添加头的jax-ws处理程序。要将authtoken传递给处理程序,您需要将客户机强制转换为
BindingProvider
并将数据添加到请求上下文中。拆下
axis2-jaxws
jar,以便代码将使用jre中的jax-ws实现。当然,如果服务本身被部署为jax-ws服务,这就行不通了。不幸的是,代码片段没有显示是否是这样。