okhttp报错:clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on jdk 9+

2023-10-26

一、问题现象

最近在用okHttp处理http请求调用,编写jmeter压测脚本时,出现一个奇怪的问题,idea中可以正常调用。但是打成jar包后,在jmeter中去使用时,则调不通,报错:
clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on jdk 9+, 但是发现自己安装的jdk版本其实就是jdk8。

二、解决方案

查了半天,大概有两种解决办法:
1,使用更低版本的jdk
2,使用更高版本的okHttp(4.3.0版本及以上)

查了一下我项目工程中的OKhttp的版本,果然版本比较低,是3.x版本的。因此使用方法2,项目工程maven里面将okhttp的依赖版本改为4.3.0版本:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.3.0</version>
</dependency>

这样之后再次运行,不再报错:not supported on jdk 9+,但是报另外一个新的错:java.lang.NoSuchFieldError: Companion。
项目pom.xml文件中,鼠标右键》maven》Show Dependencies,查看各个依赖间的关系图:

在这里插入图片描述

可以看到okhttp与okio关联,网上查了一下原因,是底层依赖 okhttp 与okio的版本不兼容导致,okhttp是 v4.3.0,而okio的版本还是比较低的版本v1.14.0,因此会出现上述问题:

在这里插入图片描述

解决办法就是pom.xml文件中使用更高版本的okio, 比如:V2.8.0

<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>2.8.0</version>
</dependency>

此后又碰到另外一个问题,当使用jmeter3.2版本时,用上面的方法已经不会报错了。但是当我换成jmeter 5.4.3版本后,还是要继续报:not supported on jdk 9+的错误。

因此我再尝试下面的做法,然后就不报错了。
新建一个类SSLSocketClient,代码如下:

import javax.net.ssl.*;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Arrays;

public class SSLSocketClient {

    //获取这个SSLSocketFactory
    public static SSLSocketFactory getSSLSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, getTrustManager(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //获取TrustManager
    private static TrustManager[] getTrustManager() {
        return new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[]{};
                    }
                }
        };
    }

    //获取HostnameVerifier
    public static HostnameVerifier getHostnameVerifier() {
        return (s, sslSession) -> true;
    }

    public static X509TrustManager getX509TrustManager() {
        X509TrustManager trustManager = null;
        try {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
            }
            trustManager = (X509TrustManager) trustManagers[0];
        } catch (Exception e) {
            e.printStackTrace();
        }

        return trustManager;
    }
}

然后OkHttpClient初始化时设置sslSocketFactory和hostnameVerifier,代码如下:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)

                .sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager())
                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())
                .build();

完整的HttpUtils工具类代码如下:

import okhttp3.*;
import core.SSLSocketClient; //导入上面写的SSLSocketClient类,SSLSocketClient类是放在工程中的core文件夹下

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;


public class HttpUtils {
    private final static MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
    private static OkHttpClient client;
    private static final Integer DEFAULT_TIMEOUT = 10;

    static {
        client = new OkHttpClient.Builder()
                .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager())
                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())
                .build();
    }

    public static Response post(String url, Object param, Map<String, String> headers) throws IOException{
        if (param instanceof String){
            return post(url, (String) param, headers);
        } else if (param instanceof Map){
            return post(url, (Map<String, String>) param, headers);
        }
        else {
            throw new IOException("没有对的参数类型,请检查");
        }
    }

    private static Response post(String url, String param, Map<String, String> headers) throws IOException{
        RequestBody requestBody = RequestBody.create(MEDIA_TYPE, param);
        Request.Builder builder = new Request.Builder().url(url);

        for (String key : headers.keySet()) {
            builder.addHeader(key, headers.get(key));
        }
        Request request = builder.post(requestBody).build();
        return client.newCall(request).execute();
    }

    private static Response post(String url, Map<String, String> param, Map<String, String> headers) throws IOException{
        FormBody.Builder bodyBuilder = new FormBody.Builder();
        for (String key: param.keySet()){
            bodyBuilder.add(key, param.get(key));
        }
        RequestBody requestBody = bodyBuilder.build();
        Request.Builder builder = new Request.Builder().url(url);

        for (String key : headers.keySet()) {
            builder.addHeader(key, headers.get(key));
        }
        Request request = builder.post(requestBody).build();
        return client.newCall(request).execute();
    }
}

=================================================================================================
以上就是本次的全部内容,如果对你有帮助,麻烦点个赞+收藏+关注,一键三连啦~ 欢迎关注下方我的公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享各类测试开发知识干货,你的支持就是作者更新最大的动力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

okhttp报错:clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on jdk 9+ 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • Netbeans 8.1 Gnome 3 GTK+ UI 字体和选项卡高度

    我刚刚在运行 GNOME 3 桌面的 Ubuntu 16 04 上安装了 NetBeans 8 1 如果可能的话 我想继续使用 IDE 的 GTK 外观和感觉 但 UI 上的字体 尤其是选项卡中的字体 太小且重叠 我尝试添加 fontsiz
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • 关联类及如何在语言级别实现多元关联

    1 关联类 An association class is used to model an association as a class Association classes often occur in many to one and
  • JPA & Hibernate 注解

    1 Entity name EntityName 必须 name 为可选 对应数据库中一的个表 2 Table name catalog schema 可选 通常和 Entity 配合使用 只能标注在实体的 class 定义处 表示实体对应
  • linux mipi接口驱动,rp3399之mipi接口ov4689摄像头驱动

    rp3399之mipi接口ov4689摄像头驱动 rp3399之mipi接口ov4689摄像头驱动 linux的驱动程序移植的精髓在于移植而不是编写 移植不代表简单了 驱动程序包一般有几个或者几十个文件 另外有设备树进行配置资源 一个驱动的
  • chatGPT查询api的余额

    代码如下 import requests url https api openai com dashboard billing credit grants api key 填写你的key headers Authorization Bear
  • c++学习之菱形继承

    1 菱形继承 2 代码示例 采用虚继承解决多义性 并且同名数据保证只有一份 include
  • Python之选择结构(案例2:个税计算系统)

    案例2 个税计算器 一 需求分析 开发一个个人所得税计算器 用户输入工资和五险一金 计算纳税额和到手工资 参考 http www gerensuodeshui cn 应纳税所得额 工资收入金额 各项社会保险费 起征点 5000元 应纳税额
  • 音视频开发编程技术(一):视频编码格式

    1 视频是什么 所谓视频 其实就是将一张一张的图片连续的放出来 类似于播放放幻灯片一样 由于人眼的常规可视帧数是每秒24帧 也就是说当每秒播放的图片数量大于24张时 人眼反馈回大脑的画面就是连续的动作 所以 将多张图片保存下来并连续快速播放
  • 汇编程序设计与计算机体系结构,汇编程序设计与计算机体系结构:软件工程师教程...

    汇编程序设计与计算机体系结构 软件工程师教程 语音 编辑 锁定 讨论 上传视频 汇编程序设计与计算机体系结构 软件工程师教程 是2019年4月1日机械工业出版社出版的图书 作者是 美 布莱恩 R 霍尔 BrianR Hall 凯文 J 斯郎
  • Whitelabel Error Page

    启动springboot后 发现总是提示url路径错误 但是反复检查又发现好像没什么错误 注意 检查代码包是不是放在与application启动类同包下 因为springboot启动时会加载这个类同包的组件 不在一个包下就加载不了所以导致识
  • tcp短连接TIME_WAIT问题解决方法大全(1)——高屋建瓴

    tcp连接是网络编程中最基础的概念 基于不同的使用场景 我们一般区分为 长连接 和 短连接 长短连接的优点和缺点这里就不详细展开了 有心的同学直接去google查询 本文主要关注如何解决tcp短连接的TIME WAIT问题 短连接最大的优点
  • 【黑苹果教程】ELAN,FocalTech 以及 Synaptics 触控板驱动

    触控板上的手势操作应该是macOS的一大特色 但是黑苹果装完之后 很多人发现别说手势 很多基本的功能触控板都不能实现 此时你需要安装触控板驱动 本文参照osxlatitude论坛的ELAN FocalTech and Synaptics S
  • NMOS和PMOS详解以及电路设计

    一 简介 MOS管 是MOSFET的缩写 MOSFET金属 氧化物半导体场效应晶体管 简称金氧半场效晶体管 Metal Oxide Semiconductor Field Effect Transistor MOSFET 其中 G是栅极 S
  • apache 中 httpd.conf 的配置详解

    部分 1 全局环境 血泪提醒 rootDocument里面一定要有index php 或者index html 不然403错误 T T 本部分的表示将影响所有Apache的操作 例如 所能处理的并发请求数或配置文件地址 ServerType
  • Python拾遗2

    Python高级编程 第2版 1 常见的装饰器模式 参数检查 缓存 代理 上下文提供者 2 Python3新增函数注解 使用场景 类型检查 让IDE显示函数接受和返回的类型 函数重载 其他语言之间的桥梁 适配 谓词逻辑函数 数据库查询映射
  • python的输入与输出

    python输入 input 与输出 print 一 输入 input 在python3中 input会将接收到的用户输入自动存储为字符串类型 username input 输入用户名 cuihua print username cuihu
  • nlp-位置编码解析

    看到这里 是否记得前面提及Vaswani推出的Transformer结构 那么如果不使用RNN结构 是怎样表示位置信息的呢 在提信息位置技术前 先简介以下RNN和CNN RNN的序列结构不适合大规模并行训练 因为大家都知道 RNN对于序列问
  • matlab lstm工具箱,[转载]RNN以及LSTM的Matlab代码

    implementation of LSTM clc clear close all training dataset generation binary dim 8 largest number 2 binary dim 1 binary
  • LeetCode 667. 优美的排列 II

    题目链接 https leetcode cn problems beautiful arrangement ii C 代码如下 class Solution public vector
  • table元素无法固定列宽,width设置无效

    之前在做table的时候 因为不是用来做数据的展示的 所以对于具体的格式没有太高的要求 所以没有去深入了解 这次在做一个数据展示列表的时候使用table 因为假设每一个单元格数据是没有固定长度的 所以为了界面不会因为数据的变化格式发生大变化
  • okhttp报错:clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on jdk 9+

    一 问题现象 最近在用okHttp处理http请求调用 编写jmeter压测脚本时 出现一个奇怪的问题 idea中可以正常调用 但是打成jar包后 在jmeter中去使用时 则调不通 报错 clientBuilder sslSocketFa