gpt4 book ai didi

java - 使用 CXF 使用具有 HTTP 基本身份验证的 Web 服务时出现 401 错误

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:51 25 4
gpt4 key购买 nike

我正在尝试在 JUnit 测试中使用使用 Apache CXF 的 HTTP 基本身份验证的远程 Web 服务。

我得到的错误是:

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.<init>(WSServiceDelegate.java:217)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:165)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:93)
at javax.xml.ws.Service.<init>(Service.java:76)
at com.wave2.marketplace.importer.impl.adportal.ws.MyServiceService.<init>(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

已阅读this StackOverflow post ,我尝试将身份验证凭据添加到我的请求上下文中,如下所示:

@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 代码之前,因此错误保持不变。

我确实读过这个 article及其 follow-up ,但到目前为止,我无法确定如何在不使用 Spring 的情况下添加拦截器代码(这是用于 JUnit 测试)。

我该如何针对此 Web 服务进行身份验证?

最佳答案

根据 HTTP basic authentication with JAX-WS (Client) :

2. The service class creation

A constructor of the service object requires access to the WSDL. And again it does not support basic authentication out of the box. You have an option to download the wsdl file and use it locally. Another option is to use the default authenticator:

Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
USER_NAME,
PASSWORD.toCharArray());
}
});

关于java - 使用 CXF 使用具有 HTTP 基本身份验证的 Web 服务时出现 401 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com