401 ошибка при потреблении веб-сервиса с Базовой аутентификацией HTTP с помощью CXF

Я пытаюсь использовать удаленный веб-сервис, который использует Базовую аутентификацию HTTP, с помощью Apache CXF, в тесте JUnit.

Ошибка, которую я получаю:

javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://localhost:8080/services/MyService?wsdl. It failed with: 
    Server returned HTTP response code: 401 for URL: http://localhost:8080/services/MyService?wsdl.
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:151)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:133)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:254)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:217)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:165)
    at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:93)
    at javax.xml.ws.Service.(Service.java:76)
    at com.wave2.marketplace.importer.impl.adportal.ws.MyServiceService.(MyServiceService.java:37)
    at com.wave2.marketplace.importer.impl.adportal.MyWSTest.testConsumingTheWS(MyWSTest.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at junit.framework.TestCase.runTest(TestCase.java:168)
    at junit.framework.TestCase.runBare(TestCase.java:134)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:232)
    at junit.framework.TestSuite.run(TestSuite.java:227)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: http://localhost:8080/services/MyService?wsdl
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1269)
    at java.net.URL.openStream(URL.java:1029)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:793)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:251)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:118)
    ... 26 more

Читая это сообщение StackOverflow, я попытался добавить подлинные учетные данные к своему контексту запроса, следующим образом:

@Test
public void testConsumingTheWS() throws Exception {
    URL wsdl = new URL("http://localhost:8080/services/MyService?wsdl");

    MyServiceService provider = new MyServiceService(wsdl); // <-- Error occurs here
    MyService service = provider.getMyService();

    BindingProvider binding = (BindingProvider)service;
    binding.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username");
    binding.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password");

    Ping out = service.getPing();
    assertNotNull(out);
}

Однако как мой встроенный комментарий указывает, ошибка происходит, прежде чем код BindingProvider достигнут, таким образом, ошибка остается тем же.

У меня действительно были чтение этой статьи и ее продолжение, но до сих пор я испытал затруднения при определении, как пойти о добавлении кода перехватчика без использования Spring (это для теста JUnit).

Как я мог бы пойти об аутентификации против этого веб-сервиса?

12
задан Community 23 May 2017 в 11:45
поделиться

2 ответа

Согласно Базовая аутентификация HTTP с JAX-WS (Клиент) :

2. Создание служебного класса

Конструктор служебного объекта. требуется доступ к WSDL. И снова он не поддерживает базовые аутентификация из коробки. Ты есть возможность скачать wsdl файл и использовать его локально. Другой вариант - использовать значение по умолчанию аутентификатор:

 Authenticator.setDefault (новый Authenticator () {
 @Override
protected PasswordAuthentication getPasswordAuthentication () {
вернуть новый пароль аутентификации (
ИМЯ ПОЛЬЗОВАТЕЛЯ,
PASSWORD.toCharArray ());
 }
});
25
ответ дан 2 December 2019 в 05:03
поделиться

Обратите внимание, вы не используете CXF. Вы используете эталонную реализацию JAX-WS, встроенную в JDK.

С CXF вы МОЖЕТЕ использовать конфигурацию Spring для всего и не устанавливать аутентификатор по умолчанию. См. Страницу по адресу:

http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html

о http-conf: настройках авторизации.

5
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: