当前位置: 移动技术网 > IT编程>开发语言>Java > 使用okhttp3,提示【clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on JDK 9+】

使用okhttp3,提示【clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on JDK 9+】

2020年07月17日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网