使用okhttp3,提示【clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on JDK 9+】
程序员文章站
2024-01-11 17:17:52
1.错误代码果然,换新电脑就是问题多。今天从官网下载了jdk 1.8.0_251版本,之前用的是jdk 1.8.0_188版本,然后在执行下面代码时,就报错了!new OkHttpClient().newBuilder() .sslSocketFactory(sslContext.getSocketFactory(), Platform.get().trustManager(sslContext.getSocketFactory())) .build();...
1.错误代码
果然,换新电脑就是问题多。
今天从官网下载了jdk 1.8.0_251版本,之前用的是jdk 1.8.0_188版本,然后在执行下面代码时,就报错了!
new OkHttpClient().newBuilder()
.sslSocketFactory(sslContext.getSocketFactory(), Platform.get().trustManager(sslContext.getSocketFactory()))
.build();
报错:
clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on JDK 9+
我这是新电脑,从没装过啥jdk 9。
2.分析
打个断点调试一下,发现是在执行 Platform.get().trustManager() 时报错了,这个get()方法会返回 Platform对象。
public class Platform {
private static final Platform PLATFORM = findPlatform();
public static final int INFO = 4;
public static final int WARN = 5;
private static final Logger logger = Logger.getLogger(OkHttpClient.class.getName());
public static Platform get() {
return PLATFORM;
}
}
而这个对象有4个子类:
在我使用jdk8的正常情况下,不需要返回期中的任何一个子类,它却返回了Jdk9Platform对象。
再进行Jdk9Platform里看看:
它是通过JDK的SSLParameters这个类里有没有setApplicationProtocols方法和SSLSocket类中有没有getApplicationProtocol()方法来判断是不是属于jdk9, 很可惜在jdk 1.8.0_251及后续版本里都有上面两个方法,因此导致判断错误。而在jdk 1.8.0_188中是没有上述几个方法。这应该属于okhttp的bug.
因此,换到之前的版本就没问题了~
本文地址:https://blog.csdn.net/ever_now_future/article/details/107366139