前言

在学习 Spring Cloud 微服务架构的过程中,我遇到了一个让我排查了三四天的诡异问题。代码写着写着,突然各种服务都连不上了——Redisson 连接 Redis 失败、MyBatis 异常、JDBC 连接数据库报错。明明配置文件里的地址和密码都是正确的,但就是连不上。

最后发现,罪魁祸首竟然是 IDEA 的一个编码配置被改成了 UTF-16


问题现象

某天启动项目时,突然报错:

1、Unable to connect to Redis server: localhost/127.0.0.1:6379
2、Access denied for user 'root'@'localhost' (using password: YES)
3、org.mybatis.spring.MyBatisSystemException
4、Failed to obtain JDBC Connection

奇怪的是

  • 配置文件中的 Redis 地址、密码完全正确

  • 数据库连接手动测试可以连接

  • 之前一直正常运行,没有改动过配置


拒绝废话、跳转解决方法

排查过程

第一阶段:怀疑依赖版本

检查了 pom.xml 中的 Spring Boot、Spring Cloud、Spring Cloud Alibaba 版本兼容性:

Spring Boot Spring Cloud Spring Cloud Alibaba
3.2.x 2023.0.x 2023.0.x
3.3.x 2023.0.x 2023.0.x
3.4.x 2024.0.x 2023.0.3.2+

发现版本确实有问题,修正后仍然报错。

第二阶段:怀疑缓存问题

尝试了各种清理操作:

  • mvn clean install -U

  • IDEA 的 Invalidate Caches and Restart

  • 删除 target 目录重新编译

问题依旧。

第三阶段:怀疑环境问题
  • 检查 Redis 服务状态 ✅ 正常

  • 检查 MySQL 服务状态 ✅ 正常

  • 检查端口占用 ✅ 正常

  • 检查防火墙 ✅ 正常

第四阶段:终极排查

在排查了三四天后,我决定删除整个 .idea 文件夹,重新导入项目

然后,问题解决了!


真相大白

打开 .idea/encodings.xml 文件,发现:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
    <!-- 各种模块编码配置,都是 UTF-8 -->
    <file url="file://$PROJECT_DIR$/api/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
    <!-- ... -->
    
    <!-- 罪魁祸首!!! -->
    <file url="PROJECT" charset="UTF-16" />
  </component>
</project>

整个项目的编码被设置成了 UTF-16,而实际文件都是 UTF-8 编码!


为什么 UTF-16 会导致这些问题?

问题 原因
Redis 连接失败 配置文件被错误解码,localhost 和密码变成乱码
JDBC 连接失败 数据库 URL 解析错误
MyBatis 异常 XML mapper 文件编码错误
YAML 解析失败 application.yml 被错误解码

UTF-8 vs UTF-16 对比

字符 "A":
  UTF-8:  01000001          (1 字节)
  UTF-16: 00000000 01000001 (2 字节)
​
字符 "中":
  UTF-8:  11100100 10111000 10101101 (3 字节)
  UTF-16: 01001110 00101101          (2 字节)

当 IDEA 用 UTF-16 去读取 UTF-8 编码的配置文件时,所有内容都变成了乱码!


可能的原因

  1. 项目多次重构/重命名.idea 目录下有多个旧的 .iml 文件(Dualchoice-Backend.imlUserHub-Backend.iml 等),说明项目经历了多次重构,配置迁移过程中产生了错误。

  2. IDEA 版本升级:升级过程中配置文件可能被意外修改。

  3. Windows 系统编码:Windows 中文版某些工具可能默认使用 UTF-16。

  4. Git 冲突:多人协作时 .idea 配置冲突。


解决方案

方案一:删除 .idea 重新导入
# 删除 .idea 文件夹
Remove-Item -Recurse -Force ".idea"
​
# 重新用 IDEA 打开项目,会自动重新生成配置
方案二:手动修复 encodings.xml

将最后一行改为:

<file url="PROJECT" charset="UTF-16" />  <!--修改前-->
<file url="PROJECT" charset="UTF-8" /> <!--修改后-->

预防措施

在项目根目录创建 .gitignore

# IDE 配置 - 不要提交到版本库
.idea/
*.iml
​
# 编译输出
target/
*.class
​
# 日志
logs/
*.log
​
# 系统文件
.DS_Store
Thumbs.db

IDEA 编码设置检查

Settings → Editor → File Encodings
├── Global Encoding: UTF-8
├── Project Encoding: UTF-8
├── Default encoding for properties files: UTF-8
└── Create UTF-8 files: with NO BOM
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐