【发布时间】:2015-07-17 21:12:24
【问题描述】:
我正在使用 Jackson 的 ObjectMapper 类向 URL 发出请求。这在我的本地机器(Mac)上运行良好,但在我的 Unix VM 上失败了。不同之处在于我的 VM 在防火墙后面,而我的 mac 不在。但是,两台机器都可以访问同一个代理。
似乎可能涉及一些 SSL 问题。谁能发现这个问题?
在两个部署中使用以下系统属性:
System.setProperty("http.proxyHost", _config.getProxyHost());
System.setProperty("http.proxyPort", _config.getProxyPort());
System.setProperty("https.proxyHost", _config.getProxyHost());
System.setProperty("https.proxyPort", _config.getProxyPort());
这是来自 unix 盒子的完整堆栈跟踪:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1511)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at java.net.URL.openStream(URL.java:1038)
at com.fasterxml.jackson.core.JsonFactory._optimizedStreamFromURL(JsonFactory.java:1420)
at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:730)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2137)
当我使用:-Djavax.net.debug=ssl 我看到以下内容:
main, WRITE: TLSv1.2 Handshake, length = 286
main, handling exception: java.net.SocketException: Connection reset
main, SEND TLSv1.2 ALERT: fatal, description = unexpected_message
main, WRITE: TLSv1.2 Alert, length = 2
main, Exception sending alert: java.net.SocketException: Broken pipe
main, called closeSocket()
【问题讨论】:
-
为什么不自己打开流并将流传递给jackson,而不是传递URL?
-
不太确定这会有什么不同:(。刚刚尝试过并收到相同的问题(来源不同)线程“main”中的异常 java.net.SocketException: Connection reset at java .net.SocketInputStream.read(SocketInputStream.java:189) ... 在 java.net.URL.openStream(URL.java:1038)
-
现在你知道这与杰克逊无关