ScannerException: while scanning for the next token found character ‘@‘ 问题解决

文章讲述了在项目启动时遇到的YAML配置文件报错,原因可能是YML文件和POM文件profiles配置不一致,但作者排除了这个可能,指出问题通常源于IDEA缓存。解决方案是右键点击Maven模块并执行Maven-Reimport。

今天启动项目时,突然报错Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character '@' that cannot start any token.

只要启动就会指向yml文件中server-addr:@config.server-addr@的第一个@,前一天晚上启动的时候还是好好的,百思不得其解。

检索了一下,大致有以下两种情况:

1、yml配置文件和pom文件中的profiles不一致

2、Idea缓存问题

排查:

yml和pom文件中是一致的,所以应该不是这个问题引起的。

选择当前所在的模块,右键Maven-Run Maven-Reimport,可以解决问题。

大部分产生这个问题的原因应该是缓存问题,如果大家出现了同样的错误,可以先Reimport一下。

参考文章:https://blog.youkuaiyun.com/m290345792/article/details/118931583

<think>嗯,用户需要解决SnakeYAML解析YAML文件时遇到'@'字符报错的问题。这个问题Spring Boot项目中很常见,特别是配置文件中包含特殊字符时容易触发编码异常。 从用户提供的引用信息来看,有几个关键点值得注意: 引用[1]显示错误发生在扫描别名时,第54行26列出现了问题字符。引用[2]指出根本原因是字符编码不匹配导致的MalformedInputException。引用[3]给出了一个具体案例:当密码包含"!QAZ2wsx#EDC"这类特殊字符时,需要加双引号处理。引用[4]则提供了更彻底的解决方案——在pom文件中强制指定UTF-8编码。 用户可能正在尝试配置数据库连接,而密码里恰好包含'@'符号。这个字符在YAML中确实需要特别注意,因为它在某些上下文里具有特殊含义(比如邮件地址格式)。不过更常见的还是编码问题引起的误判。 解决方案需要分层处理: 首先应该检查文件编码,确保.yml文件保存为UTF-8格式。如果使用IDEA,右下角可以确认当前编码,必要时通过File > Convert Encoding转换。然后检查特殊字符处理,对于包含'@'的字段值,必须用引号包裹。最后考虑项目级编码设置,在pom.xml中添加UTF-8强制声明能解决Maven编译时的编码冲突。 特别要注意的是,如果'@'出现在密码中,仅仅加引号可能还不够。某些情况下需要检查是否意外触发了YAML的锚点语法(&和*),这时改用块标量符号(|或>)会更安全。另外,Spring Boot 2.4之后的新配置机制对特殊字符更敏感,必要时可以考虑回退到.properties文件配置。 用户可能还忽略了环境变量注入的方式。其实在Spring Boot中,完全可以通过SPRING_DATASOURCE_PASSWORD环境变量传入带'@'的密码,这样就能彻底避开YAML解析问题。这种方式在容器化部署时尤其方便。</think>根据报错信息`ScannerException`和字符`@`,根本原因是YAML解析器将`@`识别为非法字符(通常因**编码不匹配**或**未转义特殊字符**引起)。以下是系统解决方案: --- ### **解决方案步骤** 1. **检查文件编码** - 确保`.yml`文件保存为 **UTF-8 without BOM** 格式(IDEA:右下角切换编码 → 选择`UTF-8` → 保存时勾选`Convert`)[^2][^4]。 - 在`pom.xml`中全局指定编码: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties> ``` 2. **转义特殊字符** YAML中`@`、`!`、`#`等字符需用**引号包裹**: ```yaml password: "P@ssw0rd!" # 双引号包裹含@的字符串 ``` 3. **验证配置文件语法** - 检查报错行(如第54行)附近是否有: - 未闭合的引号 - 缩进错误(必须用空格,非Tab) - 非法字符(如中文冒号`:`) - 使用在线YAML校验工具(如[YAML Lint](https://www.yamllint.com/))快速定位语法错误。 4. **排查隐藏字符** 若从其他文件复制内容,可能带入不可见字符: - 用IDE的`Show Whitespaces`功能(IDEA: `View → Active Editor → Show Whitespaces`)检查隐藏符号。 - 尝试重写报错行代码。 --- ### **根本原因分析** | 问题类型 | 触发场景 | 解决思路 | |-------------------|--------------------------|-----------------------------| | **编码不匹配** | 文件保存为ANSI/GBK | 转UTF-8无BOM格式 [^2][^4] | | **特殊字符未转义**| 密码含`@`、`!`、`#`等 | 双引号包裹整个字符串 [^3] | | **语法错误** | 缩进错误/中文符号 | 校验YAML结构 | --- ### **预防措施** ```yaml # 正确示例:特殊字符转义 + 注释分隔 database: url: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8 username: admin password: "P@ssw0rd#123" # 关键!引号包裹特殊字符 ``` > **注**:Spring Boot 2.4+版本对YAML要求更严格,建议优先使用`application.properties`(无需转义特殊字符)[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J_novice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值