我正在尝试在 JUnit 测试中使用使用 HTTP 基本身份验证(使用 Apache CXF)的远程 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
读过这个 StackOverflow 帖子 https://stackoverflow.com/questions/705728/how-do-i-consume-a-web-service-protected-with-http-basic-authentication-using-the,我尝试将身份验证凭据添加到我的请求上下文中,如下所示:
@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 http://chrisdail.com/2008/03/31/apache-cxf-with-http-basic-authentication/和它的跟进 http://chrisdail.com/2008/08/13/http-basic-authentication-with-apache-cxf-revisited/,但到目前为止,我无法确定如何在不使用 Spring 的情况下添加拦截器代码(这是用于 JUnit 测试)。
我该如何针对此 Web 服务进行身份验证?
根据使用 JAX-WS(客户端)进行 HTTP 基本身份验证 http://etfdevlab.blogspot.com/2009/12/http-basic-authentication-with-jax-ws.html:
2.服务类的创建
服务对象的构造函数
需要访问 WSDL。然后再次
它不支持基本的
开箱即用的身份验证。你
可以选择下载 wsdl
文件并在本地使用。其他
选项是使用默认值
验证器:
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
USER_NAME,
PASSWORD.toCharArray());
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)