Как передать SOAP-заголовки с помощью JAXWSProxyHandler
Я пытаюсь использовать Opentext Content Web Services(CWS) из моего веб-сервиса на базе axis2.
Это фрагмент кода, который создает прокси-клиент для 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, docManClient является объектом JAXWSProxyHandler, и его нельзя ни привести ни к WSBindingProvider, ни к выполнению метода setOutboundHeaders.
Поэтому мой вопрос: как передать свой заголовок с помощью AuthElement с помощью JAXWSProxyHandler (сделать то же самое, что и метод setOutBoundHeaders) ИЛИ Могу ли я каким-то образом преобразовать объект JAXWSProxyHandler в объект SEIStub?
1 ответ
Проблема возникает из-за того, что вы используете API, специфичный для реализации JAX-WS в JRE. Однако при работе на Axis2 будет использоваться реализация JAX-WS, предоставляемая Axis2. Эта реализация поддерживает другой набор расширений API.
Это означает, что ваш код не переносим между различными реализациями JAX-WS. У вас есть два варианта:
Сделайте его переносимым, используя только стандартные API. В вашем случае это потребует реализации обработчика JAX-WS, который добавляет заголовок. Чтобы передать authToken обработчику, вы должны привести клиента к
BindingProvider
и добавьте данные в контекст запроса.Удалить
axis2-jaxws
JAR из вашего развертывания Axis2, чтобы ваш код использовал реализацию JAX-WS из JRE. Конечно, это не будет работать, если сама служба развернута как служба JAX-WS. К сожалению, фрагмент кода не показывает, так ли это на самом деле.