JAX-WS WebService客户端 – “响应:’401:未经授权’为url”

我正在尝试用Java实例化一个Web服务客户端,其URL由用户名和密码保护。 实例化它时,抛出WebServiceException; 这是堆栈跟踪:

javax.xml.ws.WebServiceException: java.io.FileNotFoundException: Response: '401: Unauthorized' for url: WSDLURL at com.sun.xml.ws.wsdl.WSDLContext.(WSDLContext.java:68) at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:207) at com.sun.xml.ws.client.WSServiceDelegate.(WSServiceDelegate.java:165) at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:49) at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:18) at javax.xml.ws.Service.(Service.java:57) at org.openuri.ServiceUtilityWS.(ServiceUtilityWS.java:36) at it.cartasi.pb.giustificatomotivo.util.Util.sendEmail(Util.java:110) at it.cartasi.pb.giustificatomotivo.action.ConfermaAction.execute(ConfermaAction.java:36) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at it.cartasi.pb.giustificatomotivo.filter.SessionFilter.doFilter(SessionFilter.java:68) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(Unknown Source) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1398) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200) at weblogic.work.ExecuteThread.run(ExecuteThread.java:172) java.io.FileNotFoundException: Response: '401: Unauthorized' for url: WSDLURL at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:467) at weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:36) at java.net.URL.openStream(URL.java:1007) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:666) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseWSDL(RuntimeWSDLParser.java:152) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:99) at com.sun.xml.ws.wsdl.WSDLContext.(WSDLContext.java:65) at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:207) at com.sun.xml.ws.client.WSServiceDelegate.(WSServiceDelegate.java:165) at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:49) at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:18) at javax.xml.ws.Service.(Service.java:57) at org.openuri.ServiceUtilityWS.(ServiceUtilityWS.java:36) at it.cartasi.pb.giustificatomotivo.util.Util.sendEmail(Util.java:110) at it.cartasi.pb.giustificatomotivo.action.ConfermaAction.execute(ConfermaAction.java:36) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at it.cartasi.pb.giustificatomotivo.filter.SessionFilter.doFilter(SessionFilter.java:68) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(Unknown Source) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1398) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200) at weblogic.work.ExecuteThread.run(ExecuteThread.java:172) 

这是我的代码片段(我还设置了默认validation器):

 Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { char[] charArray = password.toCharArray(); System.out.println(user); System.out.println(charArray); return new PasswordAuthentication( user, charArray); } }); try { ws = new ServiceUtilityWS(new URL(wsdlUrl), new QName("ServiceUtilityWSSoap")); // Exception thrown here } catch (MalformedURLException e) { } 

我可以使用这些凭据通过浏览器访问它。 有谁知道为什么会这样?

注意:

该应用程序部署在Weblogic 10上。如果我从main运行该代码,则不会抛出exception。

由于它的URLStreamHandler,这是一个Weblogic 10问题。 我通过以下方式解决了这个问题:

  • 像这样实例化WSDL Url:

     URLStreamHandler handler = new sun.net.www.protocol.http.Handler(); //standard http handler URL url = null; try { url = new URL(null, wsdlUrl, handler); //forced this http handler here ws = ServiceUtilityWS.create(url, qName); } catch (MalformedURLException e) { } 
  • 解决之后,我在服务操作调用上遇到了类似的exception。 为了解决这个问题,我在SOAP Message链中添加了一个自定义Handler:

      Binding aBinding = bindingProvider.getBinding(); List handlerChain = aBinding.getHandlerChain(); handlerChain.add(new SOAPHandler() { public Set getHeaders() { return new TreeSet(); } public boolean handleMessage(SOAPMessageContext context) { final Boolean outInd = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outInd.booleanValue()) { try { context.put(BindingProvider.USERNAME_PROPERTY, user); context.put(BindingProvider.PASSWORD_PROPERTY, password); } catch (final Exception e) { return false; } } return true; } 

通过设置参数UseSunHttpHandler也可以解决此问题
-DUseSunHttpHandler = true传递给weblogic启动脚本

https://pravejay.wordpress.com/2012/09/21/weblogic-javax-xml-ws-webserviceexception-failed-to-access-the-wsdl-response-401-unauthorized/