2016-07-21 30 views
0

我试图在Talend Jaspersoft ETL Express版本5.6的帮助下将数据从REST API中获取到我们的数据库。 为了确保我的问题与我们的服务器配置无关,我也在本地安装了该工具并卡住了。由于我是一个对Java不熟练,但需要为他的公司运行的学生,我希望你能帮助我。我只有一些基本的知识,所以我没有尝试在“代码”选项卡中找到解决方案,只与设计师一起工作。Talend:REST调用结果为“URI不是绝对的”或“UnknownHostException”

最后我想尝试下面的教程: http://dwetl.com/2015/08/11/trest-use-case-example-use-rest-api-in-talend/ 但这对我来说不起作用。当我在浏览器中使用该调用时,我可以获取数据,但使用该工具我只能获取错误。

随着 “https://api.github.com/users/mralexgray/followers” 作为URL我得到一个UnknownHostException:

Starte Job Test am 11:20 21/07/2016. 

[statistics] connecting to socket on port 3941 
[statistics] connected 
Exception in component tREST_1 
com.sun.jersey.api.client.ClientHandlerException: java.net.UnknownHostException: api.github.com 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:131) 
    at com.sun.jersey.api.client.Client.handle(Client.java:616) 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:559) 
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:182) 
    at testetl.test_0_1.Test.tREST_1Process(Test.java:572) 
    at testetl.test_0_1.Test.runJobInTOS(Test.java:929) 
    at testetl.test_0_1.Test.main(Test.java:786) 
Caused by: java.net.UnknownHostException: api.github.com 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source) 
    at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
[statistics] disconnected 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at java.net.HttpURLConnection.getResponseCode(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:218) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129) 
    ... 6 more 
Job Test endet am 11:20 21/07/2016. [exit code=1] 

如果我切断说: “https://开头” 的一部分,并使用 “api.github.com/users/mralexgray/followers” 为网址我得到的错误“开放的我们也不是绝对的”

Starte Job Test am 11:31 21/07/2016. 

[statistics] connecting to socket on port 3809 
[statistics] connected 
Exception in component tREST_1 
com.sun.jersey.api.client.ClientHandlerException: java.lang.IllegalArgumentException: URI is not absolute 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:131) 
    at com.sun.jersey.api.client.Client.handle(Client.java:616) 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:559) 
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:182) 
    at testetl.test_0_1.Test.tREST_1Process(Test.java:572) 
    at testetl.test_0_1.Test.runJobInTOS(Test.java:929) 
    at testetl.test_0_1.Test.main(Test.java:786) 
Caused by: java.lang.IllegalArgumentException: URI is not absolute 
    at java.net.URI.toURL(Unknown Source) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:140) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129) 
    ... 6 more 
[statistics] disconnected 
Job Test endet am 11:31 21/07/2016. [exit code=1] 

只给你尽可能多的信息越好,这里是一个小部分出来的自动生成,这似乎是这个REST调用我的Java代码,但也许我完全错了,这完全没有帮助,因为我只有基本的java知识:

 /** 
     * [tREST_1 begin ] start 
     */ 

     ok_Hash.put("tREST_1", false); 
     start_Hash.put("tREST_1", System.currentTimeMillis()); 

     currentComponent = "tREST_1"; 

     int tos_count_tREST_1 = 0; 

     String endpoint_tREST_1 = "api.github.com/users/mralexgray/followers"; 

     String trustStoreFile_tREST_1 = System 
       .getProperty("javax.net.ssl.trustStore"); 
     String trustStoreType_tREST_1 = System 
       .getProperty("javax.net.ssl.trustStoreType"); 
     String trustStorePWD_tREST_1 = System 
       .getProperty("javax.net.ssl.trustStorePassword"); 

     String keyStoreFile_tREST_1 = System 
       .getProperty("javax.net.ssl.keyStore"); 
     String keyStoreType_tREST_1 = System 
       .getProperty("javax.net.ssl.keyStoreType"); 
     String keyStorePWD_tREST_1 = System 
       .getProperty("javax.net.ssl.keyStorePassword"); 

     com.sun.jersey.api.client.config.ClientConfig config_tREST_1 = new com.sun.jersey.api.client.config.DefaultClientConfig(); 
     javax.net.ssl.SSLContext ctx_tREST_1 = javax.net.ssl.SSLContext 
       .getInstance("SSL"); 

     javax.net.ssl.TrustManager[] tms_tREST_1 = null; 
     if (trustStoreFile_tREST_1 != null 
       && trustStoreType_tREST_1 != null) { 
      char[] password_tREST_1 = null; 
      if (trustStorePWD_tREST_1 != null) 
       password_tREST_1 = trustStorePWD_tREST_1.toCharArray(); 
      java.security.KeyStore trustStore_tREST_1 = java.security.KeyStore 
        .getInstance(trustStoreType_tREST_1); 
      trustStore_tREST_1.load(new java.io.FileInputStream(
        trustStoreFile_tREST_1), password_tREST_1); 

      javax.net.ssl.TrustManagerFactory tmf_tREST_1 = javax.net.ssl.TrustManagerFactory 
        .getInstance(javax.net.ssl.KeyManagerFactory 
          .getDefaultAlgorithm()); 
      tmf_tREST_1.init(trustStore_tREST_1); 
      tms_tREST_1 = tmf_tREST_1.getTrustManagers(); 
     } 

     javax.net.ssl.KeyManager[] kms_tREST_1 = null; 
     if (keyStoreFile_tREST_1 != null 
       && keyStoreType_tREST_1 != null) { 
      char[] password_tREST_1 = null; 
      if (keyStorePWD_tREST_1 != null) 
       password_tREST_1 = keyStorePWD_tREST_1.toCharArray(); 
      java.security.KeyStore keyStore_tREST_1 = java.security.KeyStore 
        .getInstance(keyStoreType_tREST_1); 
      keyStore_tREST_1.load(new java.io.FileInputStream(
        keyStoreFile_tREST_1), password_tREST_1); 

      javax.net.ssl.KeyManagerFactory kmf_tREST_1 = javax.net.ssl.KeyManagerFactory 
        .getInstance(javax.net.ssl.KeyManagerFactory 
          .getDefaultAlgorithm()); 
      kmf_tREST_1.init(keyStore_tREST_1, password_tREST_1); 
      kms_tREST_1 = kmf_tREST_1.getKeyManagers(); 
     } 

     ctx_tREST_1.init(kms_tREST_1, tms_tREST_1, null); 
     config_tREST_1 
       .getProperties() 
       .put(com.sun.jersey.client.urlconnection.HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, 
         new com.sun.jersey.client.urlconnection.HTTPSProperties(
           new javax.net.ssl.HostnameVerifier() { 

            public boolean verify(
              String hostName, 
              javax.net.ssl.SSLSession session) { 
             return true; 
            } 
           }, ctx_tREST_1)); 

     com.sun.jersey.api.client.Client restClient_tREST_1 = com.sun.jersey.api.client.Client 
       .create(config_tREST_1); 
     com.sun.jersey.api.client.WebResource restResource_tREST_1; 
     if (endpoint_tREST_1 != null && !("").equals(endpoint_tREST_1)) { 
      restResource_tREST_1 = restClient_tREST_1 
        .resource(endpoint_tREST_1); 
     } else { 
      throw new IllegalArgumentException("url can't be empty!"); 
     } 

     com.sun.jersey.api.client.ClientResponse errorResponse_tREST_1 = null; 
     String restResponse_tREST_1 = ""; 
     try { 

      restResponse_tREST_1 = restResource_tREST_1 

      .get(String.class); 

     } catch (com.sun.jersey.api.client.UniformInterfaceException ue) { 
      errorResponse_tREST_1 = ue.getResponse(); 
     } 

     // for output 

     row1 = new row1Struct(); 
     if (errorResponse_tREST_1 != null) { 
      row1.ERROR_CODE = errorResponse_tREST_1.getStatus(); 
     } else { 
      row1.Body = restResponse_tREST_1; 
     } 

     /** 
     * [tREST_1 begin ] stop 
     */ 

     /** 
     * [tREST_1 main ] start 
     */ 

任何帮助将不胜感激:)。我所有的例子都是关于该教程的,但是当我试图让我们真正的API与ETL一起工作时,我刚刚得到了完全相同的问题,我猜这个教程比较容易让你们作为例子。

回答

0

java.net.UnknownHostException:您是否检查您是否位于代理之后?如果从工作室的位置,该网站无法访问,则应该发生以前的错误。

您必须知道您的浏览器不一定具有与Talend Studio相同的配置。因此,请检查您的“互联网设置”是否存在任何代理。如果是这种情况,则可以在菜单中更改代理设置:窗口 - >首选项,在常规 - >网络下。

+0

谢谢你的回答。我今天再次进入公司,所以我尽快检查了代理的事情。如果我转到C:\ WINDOWS \ System32 \ inetcpl.cpl并查看连接选项卡,它不会显示任何设置。对于局域网设置是一个代理服务器集,现在我试图取消选中“绕过代理服务器的本地地址”,如果我这样做,我收到了一个不同的错误,我上传到pastebin:http://pastebin.com/ USZ4yraz 对我来说,似乎,设置代理似乎是好的,我需要离开这个盒子检查?也许我可以尝试一些其他的代理设置? – Reik

+0

我刚刚意识到,错误没有不同,因为我没有选中该复选框。我创建此线程时发生的错误消息来自使用本地安装。检查我的本地代理设置表明,我有一个固定的“自动配置”,我不能改变,因为我的公司不给我这样做的权利。 在最终应该使用的服务器上,情况并非如此,但是我们手动使用代理服务器。当我打开或关闭此代理服务器时,它似乎完全不会影响服务器消息(请参阅pastebin) – Reik

+0

正如我在前一封邮件中所写,如果在Internet设置中设置了代理服务器,则必须将其设置为Talend Studio。 Talend Studio不会自动为代理服务器设置系统设置。 – mhassine

1

我们终于可以想出办法解决我们的连接问题。 我不知道为什么Talend没有正确使用我们的代理,即使它手动设置在首选项中,但如果我们使用它的tSetProxy组件,并从服务器获取预期的JSON对象。

相关问题