【问题标题】:DocumentBuilder.parse() throwing java.net.UnknownHostException after changing a webservice URL from http to httpsDocumentBuilder.parse() 在将 Web 服务 URL 从 http 更改为 https 后抛出 java.net.UnknownHostException
【发布时间】:2017-09-29 09:19:55
【问题描述】:

以前,我们的应用程序中有以下代码,它用于获取所需的数据。我们过去只是通过传递用户名、密码和搜索参数(DEA 编号)形成 Web 服务 URL 来读取必填字段。也可以直接从浏览器中点击相同的 URL(带参数)以查看结果:

 {    DocumentBuilderFactory factory = 
      DocumentBuilderFactory.newInstance();

      DocumentBuilder parser = factory.newDocumentBuilder();

      System.setProperty("http.proxyHost", getProxyHost());
      System.setProperty("http.proxyPort", getProxyPort());

      System.out.println("Before URL formation");

      URL url = new URL(
        "http://www.deanumber.com/Websvc/deaWebsvc.asmx/GetQuery?UserName=" + getDeaUsername() + "&Password=" + getDeaPassword() + "&DEA=" + 
        deaNumber + 
        "&BAC=&BASC=&ExpirationDate=&Company=&Zip=&State=&PI=&MaxRows=");

      System.out.println("After URL formation");
      System.out.println("URL formed is: "+url);
      Document document = null;
      try {

        System.out.println("toExternalForm");

        String strURL = url.toExternalForm();

        System.out.println("toExternalForm done: "+strURL);

        **document = parser.parse(strURL);** //This is causing exception
          }
      catch (SAXParseException spe)
         {  System.out.println("Inside SAXParseException");
            spe.printStackTrace();
         }
    }

现在,Web 服务 URL 已从 http 更改为 https,其余内容相同。新 URL 也可以在浏览器中使用。此外,即使我在浏览器中输入 http URL,它也会自动重定向到 https 并显示数据。但是,上面的代码并没有做同样的事情,它给出了以下异常:java.net.ProtocolException: Unsupported protocol: https'

所以,我将代码更改为在 url 中使用 https,但现在出现了一个新异常 - java.net.UnknownHostException。从控制台日志中,我可以看到异常出现在 ==> document = parser.parse(strURL)。在这里,parser 是 DocumentBuilder 对象的引用变量,如您在上面的代码中所见。我在下面粘贴完整的堆栈跟踪。

UnknownHostException 的完整堆栈跟踪:

{java.net.UnknownHostException: www.deanumber.com
[2017-23-28 08:23,     0]ERROR[[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'](DeaFetcher.java:123) - Exception in DeaFetcher.getDeaFromUrl java.net.UnknownHostException: www.deanumber.com
            at java.net.InetAddress.getAllByName0(InetAddress.java:1250)
            at java.net.InetAddress.getAllByName(InetAddress.java:1162)
            at java.net.InetAddress.getAllByName(InetAddress.java:1098)
            at weblogic.net.http.HttpsClient.openServer(HttpsClient.java:265)
            at weblogic.net.http.HttpsClient.openServer(HttpsClient.java:350)
            at weblogic.net.http.HttpsClient.New(HttpsClient.java:553)
            at weblogic.net.http.HttpsURLConnection.getHttpClient(HttpsURLConnection.java:332)
            at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:711)
            at weblogic.net.http.SOAPHttpsURLConnection.getInputStream(SOAPHttpsURLConnection.java:37)
            at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:643)
            at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
            at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
            at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
            at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
            at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
            at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
            at weblogic.xml.jaxp.RegistryDocumentBuilder.parse(RegistryDocumentBuilder.java:163)
            at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
            at com.company.project.service.DeaFetcher.fetchDeaFromUrl(DeaFetcher.java:358)
            at com.company.project.service.DeaFetcher.fetchDeas(DeaFetcher.java:330)
            at com.company.project.service.DeaFetcher.fetchDeas(DeaFetcher.java:239)
            at com.company.project.service.DeaFetcher.fetchDeaMastersList(DeaFetcher.java:46)
            at com.company.project.service.DeaFetcher$$FastClassByCGLIB$$8f6b7575.invoke(<generated>)
            at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
            at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:695)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
            at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
            at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:630)
            at com.company.project.service.DeaFetcher$$EnhancerByCGLIB$$a5bf2c5a.fetchDeaMastersList(<generated>)
            at com.company.project.web.MainFormController.onSubmit(EntryFormController.java:137)
            at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267)
            at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:250)
            at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
            at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
            at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:857)
            at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
            at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:475)
            at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:440)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:751)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
            at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3432)
            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(SecurityManager.java:120)
            at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
            at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
            at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
            at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
            at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
            at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
}

【问题讨论】:

  • 为什么要使用 HTTPS 和代理?
  • @Jenna ,我删除了 System.setProperty 代码,但问题仍然存在。我什至打印了属性 http.proxyHost 和 http.proxyPort 并且值为空。请进一步指导。

标签: java web-services http https xml-parsing


【解决方案1】:

您似乎仍在尝试使用相同的 URL 调用 Web 服务,但这次在 URL 中使用了 HTTPS。如果是这种情况,那么您可能需要使用 Web 服务的 WSDL 生成的客户端代码以及适当的身份验证代码来调用 Web 服务。

如果您使用从 WSDL 生成的有效客户端代码调用 Web 服务,请在您的问题中提供客户端代码详细信息,以查看它在此处尝试执行的具体操作。

【讨论】:

  • 我刚刚意识到我在这里粘贴的代码不完整。我明天将在旅行时编辑帖子。
  • 有时间请检查,@AJavaCoder
  • 我认为问题与我在回答中提到的问题相同,即您需要使用从服务提供商提供的 WSDL 文件生成的 Web 服务客户端代码来访问 Web 服务。您仍在尝试访问该服务,就好像它是一个网站一样。它不再起作用,因为他们已将其设为收费服务。
  • 我也得到了 wsdl 链接。但不确定如何在代码中使用它:deanumber.com/Websvc/deaWebsvc.asmx?wsdl
  • 嘿 @AJavaCoder ,正如 Loic 所建议的那样;我能够生成代码。但问题仍然很少。请查看我对 Loic 答案的评论。
【解决方案2】:

您在 cmets 中写下您拥有 WSDL,然后让 eclipse 为此生成客户端,例如:How do you convert wsdl to java classes using Eclipse?(或在互联网上搜索“从 wsdl 生成客户端”)

【讨论】:

  • 再次感谢@Loic。我能够使用给定的步骤生成代码。使用 20 多个 .java 文件创建了一个单独的包。我只是通过传递用户名、密码和 DEA 编号来实例化他们的 GetQuery 类,并尝试打印一些我需要的值,例如 zip。当我打印这些值时,什么都没有显示。没有错误/异常。
  • 代码粘贴在下面。 GetQuery gq = new GetQuery(getDeaUsername(), getDeaPassword(), deaNumber, "", "", "", "", "", "", "", ""); System.out.println("Zip 可用?"+ gq.getZip());
  • 我广泛分析了他们的 java 文件,并能够编写一些代码来提交请求。响应也来了,因为我可以在调试模式下看到值。现在,我只需要识别节点并编写一些代码来获取所需的值。感谢您向我建议这种方法@Loic
  • "their code" ;) :这不是他们的代码,它是由 Eclipse 从 WSDL 文件生成的......我会说这种方法是标准/常见的,如果服务发生变化未来,您可以简单地重新生成客户端类。
  • 酷。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 2018-02-02
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2018-01-02
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多