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(指定时区)

错误配置示例(可能的原配置):
java 复制代码
// 原错误配置(缺少 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("你的数据库密码"); // 你的数据库密码
正确配置示例:
java 复制代码
// 修正后的配置:添加 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 中修改:
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 握手和时区问题,数据库连接成功后,后续空指针等连锁错误会自动消失。按上述步骤操作后,代码生成器即可正常工作。

相关推荐
她的男孩2 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码4 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev6 小时前
Gson → kotlinx.serialization
android·java·kotlin
小bo波14 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯16 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
SamDeepThinking1 天前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好1 天前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng1 天前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端