当前位置: 首页 > news >正文

java常见SSL bug解决方案

从日志来看,核心问题是 MyBatis Plus Generator(代码生成器)无法与 MySQL 数据库建立 SSL 连接,导致数据库连接失败,进而触发后续的 NullPointerException(连接失败后无法获取表信息,导致空指针)。下面分「错误原因」和「分步解决方法」详细说明:

一、核心错误原因

  1. SSL 握手失败:日志中 javax.net.ssl.SSLHandshakeException: No appropriate protocol 表明,Java 8 与 MySQL 建立 SSL 连接时,缺少合适的 SSL 协议版本(Java 8 默认禁用了旧的 TLSv1、TLSv1.1 协议,而 MySQL 8.0+ 默认启用 SSL 连接,两者协议不匹配)。
  2. MySQL 连接配置缺失:未在 JDBC URL 中禁用 SSL,也未指定数据库时区(MySQL 8.0+ 必须指定时区,否则会报时区错误)。
  3. 空指针连锁反应:数据库连接失败后,ConfigBuilder 无法获取数据库表信息,导致后续代码生成时触发 NullPointerException

二、分步解决方法

步骤 1:修改 MyBatis Plus Generator 的「数据库连接配置」(关键)

找到你代码中 MyBatisPlusGenerator.javaDataSourceConfig 配置部分(用于设置数据库连接信息),重点修改 JDBC URL,添加 useSSL=false(禁用 SSL)和 serverTimezone=Asia/Shanghai(指定时区)

错误配置示例(可能的原配置):
// 原错误配置(缺少 SSL 和时区参数)
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/你的数据库名"); // 缺少关键参数
dsc.setDriverName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+ 驱动类正确
dsc.setUsername("root"); // 你的数据库用户名
dsc.setPassword("你的数据库密码"); // 你的数据库密码
正确配置示例:
// 修正后的配置:添加 useSSL=false(禁用 SSL)和 serverTimezone(指定时区)
DataSourceConfig dsc = new DataSourceConfig();
// 关键修改:JDBC URL 新增 useSSL=false 和 serverTimezone=Asia/Shanghai
dsc.setUrl("jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+ 必须用这个驱动类(不能用旧的 com.mysql.jdbc.Driver)
dsc.setUsername("root"); // 替换为你的数据库用户名(如 root)
dsc.setPassword("你的数据库密码"); // 替换为你的数据库密码(如 123456)
// (可选)设置数据库类型(MySQL)
dsc.setDbType(DbType.MYSQL);
URL 参数说明:
  • useSSL=false强制禁用 SSL 连接(解决 SSL 握手失败问题,开发环境推荐禁用);
  • serverTimezone=Asia/Shanghai:指定数据库时区为上海时区(MySQL 8.0+ 必须配置,否则会报 The server time zone value 'XXX' is unrecognized 错误);
  • characterEncoding=utf8:确保数据库编码为 UTF-8,避免中文乱码。
步骤 2:验证 MySQL 服务状态(避免连接基础问题)
  1. 确认 MySQL 服务已启动:
    • Windows:打开「服务」,找到「MySQL」服务,确保状态为「正在运行」;
    • Linux/macOS:执行命令 systemctl start mysql(启动服务)或 systemctl status mysql(查看状态)。
  2. 验证数据库连接可用性:
    用 Navicat、DataGrip 或命令行连接数据库,确认 localhost:3306、用户名、密码、数据库名均正确(例如命令行:mysql -u root -p,输入密码后能正常登录)。
步骤 3:确认 MySQL 驱动版本与 Java 版本兼容(你的配置已兼容,可跳过)

你的配置中:

  • Java 版本:JDK 1.8;
  • MySQL 驱动版本:mysql-connector-java-8.0.11(MySQL 8.0 驱动,支持 JDK 1.8);
    两者完全兼容,无需修改驱动版本。若后续仍有问题,可将驱动版本升级到 8.0.28(更稳定的版本),在 pom.xml 中修改:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version> <!-- 升级到更稳定的版本 --><scope>runtime</scope>
</dependency>
步骤 4:重新运行 MyBatis Plus Generator

修改配置后,重新运行 MyBatisPlusGenerator.java,此时:

  • SSL 握手失败问题会因 useSSL=false 解决;
  • 时区问题会因 serverTimezone 解决;
  • 数据库连接成功后,ConfigBuilder 能正常获取表信息,NullPointerException 会自动消失。

三、常见额外问题排查

若仍报错,可检查以下两点:

  1. MySQL 端口是否正确:默认端口是 3306,若你修改过 MySQL 端口(如 3307),需在 URL 中同步修改(如 jdbc:mysql://localhost:3307/你的数据库名?xxx)。
  2. 数据库是否存在:确保 URL 中 3306/ 后面的「数据库名」已在 MySQL 中创建(例如 jdbc:mysql://localhost:3306/mall?xxx,需先执行 CREATE DATABASE mall; 创建数据库)。

总结

核心解决点是 在 JDBC URL 中添加 useSSL=falseserverTimezone=Asia/Shanghai,解决 SSL 握手和时区问题,数据库连接成功后,后续空指针等连锁错误会自动消失。按上述步骤操作后,代码生成器即可正常工作。


文章转载自:

http://8S9zlUlf.kjfqf.cn
http://rKMbzyUP.kjfqf.cn
http://tLavG7HN.kjfqf.cn
http://1HGqUPoJ.kjfqf.cn
http://WWgIOB2u.kjfqf.cn
http://aeaFJO6R.kjfqf.cn
http://foE0XSNa.kjfqf.cn
http://LgJadN7M.kjfqf.cn
http://EQbStr8a.kjfqf.cn
http://RPkB03wX.kjfqf.cn
http://H07QkEGj.kjfqf.cn
http://pcdEyLVQ.kjfqf.cn
http://Avv46XOI.kjfqf.cn
http://akBQ2pvp.kjfqf.cn
http://OhGllYAr.kjfqf.cn
http://IB7fRNTP.kjfqf.cn
http://3T4FO2sR.kjfqf.cn
http://FfKnhB4p.kjfqf.cn
http://3ybM5Fyd.kjfqf.cn
http://F9Kkp0P1.kjfqf.cn
http://0rdgtW38.kjfqf.cn
http://3iSZEtQC.kjfqf.cn
http://EZ5hqjHs.kjfqf.cn
http://iOnBO0gG.kjfqf.cn
http://bSEx8IbU.kjfqf.cn
http://5aHdm0ZN.kjfqf.cn
http://524lC17a.kjfqf.cn
http://ReOiGwFk.kjfqf.cn
http://0a7PAgZD.kjfqf.cn
http://zl7IuKwJ.kjfqf.cn
http://www.dtcms.com/a/375806.html

相关文章:

  • JAVA stream().flatMap()
  • 【C++】string类 - 库中的常见使用
  • Go语言基础---数据类型间的故事
  • 金融量化指标--6InformationRatio信息比率
  • GPT Server 文档
  • CDN加速带来的安全隐患及应对方法
  • HCL Unica+:AI驱动的营销自动化与个性化平台
  • spring事务管理之@Transactional
  • golang之go modules
  • 设计UIUC SE 423机电一体化的机器人
  • 《Vuejs设计与实现》第 15 章(编译器核心技术)上
  • (二)文件管理-文件查看-more命令的使用
  • IntelliJ IDEA双击Ctrl的妙用
  • cfshow-web入门-php特性
  • libvirt 新手指南:从零开始掌握虚拟化管理
  • Oracle打补丁笔记
  • 【JavaEE】(24) Linux 基础使用和程序部署
  • TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接
  • Spring MVC 的常用注解
  • 肺炎检测系统
  • ctfshow-web-SSTI模版注入
  • RHEL 10 更新 rescue kernel
  • Vue3 + Vite + Element Plus web转为 Electron 应用,解决无法登录、隐藏自定义导航栏
  • 记SpringBoot3.x + SpringSecurity6.x之session管理
  • Pinia 两种写法全攻略:Options 写法 vs Setup 写法
  • 项目管理系统高保真原型案例:剖析设计思路与技巧
  • 第2节-过滤表中的行-DELETE
  • 基于AI的未佩戴安全帽检测算法
  • webpack打包方式
  • 第2节-过滤表中的行-WHERE