问题描述
我正在尝试使用以下代码段在Java中发出Https请求:
1. java.net.URL urlObject = new java.net.URL("/*my https url*/");
2. javax.net.ssl.HttpsURLConnection HttpsURLConnection = (javax.net.ssl.HttpsURLConnection)urlObject.openConnection();
在第2行的运行时,urlObject.openConnection()
返回一个sun.net.www.protocol.https.DelegateHttpsURLConnection
的实例,该实例被强制类型转换为javax.net.ssl.HttpsURLConnection
,
但是,在一种环境中,此方法不起作用,并给出以下异常:
java.lang.classCastException: com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl cannot be cast to javax.net.ssl.HttpsURLConnection
第2行的urlObject.openConnection()
返回一个com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl
的实例,该实例无法类型转换为javax.net.ssl.HttpsURLConnection
。
有人可以帮助我理解为什么urlObject.openConnection()
在不同环境中返回不同类的不同实例。与依赖项等有关吗?
其他信息:
- 我已经阅读了有关此的其他stackoverflow答案。我的目的是了解发生这种情况的根本原因,而在其他答案中却没有传达足够的信息。
- 我发现一种工作方式是使用
com.sun.net.ssl.HttpsURLConnection con = (com.sun.net.ssl.HttpsURLConnection) urlObj.openConnection();
代替第2行。但是实际上com.sun.net.ssl.HttpsURLConnection
已被弃用。 - 另一种类似的解决方法是使用Http而不是Https,即使用
java.net.HttpURLConnection = (java.net.HttpURLConnection) urlObject.openConnection();
...但是,这并不能回答我有关问题实际发生原因的问题。 - 我正在使用openJdk 8
解决方法
您是否有任何特定原因试图将其强制转换为javax.net.ssl.HttpsURLConnection?您可以使用基类URLConnection并执行操作。