Моя программа работает на сервере, и ей необходимо выполнить клиентский вызов SOAP API с использованием Java.
Я использовал SOUPUI для генерации клиентского кода-заглушки для службы API WSDL с помощью JAX-WS Artifacts. Стороне сервера API требуется UsernameToken. Я использовал пример документа jaxws-ri «Как выполнить базовую аутентификацию в JAX-WS?» как что-то вроде ниже, чтобы вызвать API.
HelloService service = new HelloService();
Hello proxy = (service.getHelloPort());
((BindingProvider)proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "userfoo");
((BindingProvider)proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "passbar");
Output output = proxy.doAction();
return output.getResult();
Но я получаю исключение ниже на шаге proxy.doAction()
.
Исключение: com.sun.xml.ws.fault.ServerSOAPFaultException: клиент получил ошибку SOAP от сервера: security.wssecurity.WSSContextImpl.s02: com.ibm.websphere.security.WSSecurityException: исключение org.apache.axis2.AxisFault: CWWSS6500 Не существует кандидата на идентификацию вызывающего абонента, который можно использовать для входа в систему. возникла во время выполнения действия: com.ibm.ws.wssecurity.handler.WSSecurityConsumerHandler$1@30ed30ed Пожалуйста, просмотрите журнал сервера, чтобы найти более подробную информацию о точной причине сбоя.
в com.sun.xml.ws.fault.SOAP11Fault.getProtocolException (SOAP11Fault.java:193)
в com.sun.xml.ws.fault.SOAPFaultBuilder.createException (SOAPFaultBuilder.java:125)
в com .sun.xml.ws.client.sei.StubHandler.readResponse (StubHandler.java:253)
в com.sun.xml.ws.db.DatabindingImpl.deserializeResponse (DatabindingImpl.java:181)
в com .sun.xml.ws.db.DatabindingImpl.deserializeResponse (DatabindingImpl.java:258)
Усеченный. см. файл журнала для полной трассировки стека
Не могли бы вы дать мне совет, как вызвать API с помощью UsernameToken? Или нужна какая-то конфигурация на стороне сервера?