【发布时间】:2018-08-02 15:53:51
【问题描述】:
我正在开发一个在 JBoss 7 环境中运行的应用程序,因此必须最多使用 Java 7(AFAIK JBoss 7 不能在 Java 8+ 上运行,因为他们做了一些肮脏的把戏或使用了一些改变的东西从 Java 7 到 8 (source)。
我面临的问题是:我向一些仅支持 TLSv1.2 的远程 https url 发出请求,并且 first 请求成功。
任何进一步的请求都会失败,但有以下例外:
Caused by: java.lang.NullPointerException
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:986)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at <our code>
<our code> 看起来像这样:
URL url = new URL( "https://..." );
URLConnection urlConnection = url.openConnection();
urlConnection.setUseCaches( false );
urlConnection.setRequestProperty( "User-Agent", "java.net.URLConnection/" );
//Here's where we finally get the exception
OuputStream out = urlConnection.getOutputStream();
通常,NPE 问题不大,只需稍作调试即可发现错误。但是,由于它发生在专有类(sun.net....)中,我无法获得这些的源代码,至少不是在看起来正确的版本中(一个version 看起来像这样,就像 986:@ 987654327@ - 几乎不是 NPE 的来源)。
这发生在 Oracle JDK 1.7.0u80 和 OpenJDK 7u75 中。
有什么想法吗?
【问题讨论】:
-
This 似乎是一个更接近的版本。初始化
http有一些复杂的逻辑,似乎并不总是成功,接着调用ps = (PrintStream)http.getOutputStream(); -
@yole 感谢链接。我将它作为源代码添加到我的 IDE 中,并且能够进行调试——即使线路有些偏离。原来有人在我们的代码中设置了一个自定义代理选择器并删除它解决了问题(这又是旧的第 8 层问题:))。
标签: java httpconnection