java常见SSL bug解决方案
从日志来看,核心问题是 MyBatis Plus Generator(代码生成器)无法与 MySQL 数据库建立 SSL 连接,导致数据库连接失败,进而触发后续的 NullPointerException
(连接失败后无法获取表信息,导致空指针)。下面分「错误原因」和「分步解决方法」详细说明:
一、核心错误原因
- SSL 握手失败:日志中
javax.net.ssl.SSLHandshakeException: No appropriate protocol
表明,Java 8 与 MySQL 建立 SSL 连接时,缺少合适的 SSL 协议版本(Java 8 默认禁用了旧的 TLSv1、TLSv1.1 协议,而 MySQL 8.0+ 默认启用 SSL 连接,两者协议不匹配)。 - MySQL 连接配置缺失:未在 JDBC URL 中禁用 SSL,也未指定数据库时区(MySQL 8.0+ 必须指定时区,否则会报时区错误)。
- 空指针连锁反应:数据库连接失败后,
ConfigBuilder
无法获取数据库表信息,导致后续代码生成时触发NullPointerException
。
二、分步解决方法
步骤 1:修改 MyBatis Plus Generator 的「数据库连接配置」(关键)
找到你代码中 MyBatisPlusGenerator.java
的 DataSourceConfig
配置部分(用于设置数据库连接信息),重点修改 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 服务状态(避免连接基础问题)
- 确认 MySQL 服务已启动:
- Windows:打开「服务」,找到「MySQL」服务,确保状态为「正在运行」;
- Linux/macOS:执行命令
systemctl start mysql
(启动服务)或systemctl status mysql
(查看状态)。
- 验证数据库连接可用性:
用 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
会自动消失。
三、常见额外问题排查
若仍报错,可检查以下两点:
- MySQL 端口是否正确:默认端口是 3306,若你修改过 MySQL 端口(如 3307),需在 URL 中同步修改(如
jdbc:mysql://localhost:3307/你的数据库名?xxx
)。 - 数据库是否存在:确保 URL 中
3306/
后面的「数据库名」已在 MySQL 中创建(例如jdbc:mysql://localhost:3306/mall?xxx
,需先执行CREATE DATABASE mall;
创建数据库)。
总结
核心解决点是 在 JDBC URL 中添加 useSSL=false
和 serverTimezone=Asia/Shanghai
,解决 SSL 握手和时区问题,数据库连接成功后,后续空指针等连锁错误会自动消失。按上述步骤操作后,代码生成器即可正常工作。