欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 23:39:27
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个子类:

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

在我使用jdk8的正常情况下,不需要返回期中的任何一个子类,它却返回了Jdk9Platform对象。

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

再进行Jdk9Platform里看看:

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

它是通过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