yaml to properties failed, reason: Parse yaml file content failed for namespace: application.yml [Cause: org.yaml.snakeyaml.constructor.SafeConstructor: method <init>()V not found]

背景

springboot2.2.x 升级到是springboot2.7.x,apollo-client也跟着升级到了2.0.1,配置中心使用.properties的应用启动正常,
使用.yml报了上面的错误

解决方案

下面是ai回答的结果
让我们尝试几个可能的解决方案:

  1. 检查你的 Spring Boot 版本和 SnakeYAML 版本是否匹配。对于 Spring Boot 3.x,建议使用:
<!-- Spring Boot 3.x -->
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.2</version>
</dependency>

<!-- Spring Boot 2.x -->
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.33</version>
</dependency>
  1. 如果你使用 Spring Boot parent,可以尝试在 properties 中覆盖版本:
<properties>
    <snakeyaml.version>2.2</snakeyaml.version>
</properties>
  1. 尝试清理依赖冲突:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.2</version>
</dependency>
  1. 检查 YAML 文件格式是否正确:
  • 确保缩进使用空格而不是制表符
  • 检查键值对格式
  • 确保冒号后有空格
  1. 如果以上都不行,可以尝试降级 SnakeYAML 版本:
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.33</version>
</dependency>
  1. 重新构建项目:
mvn clean package -U

根因探究

升级后的apollo-client在将yaml转properties的时候还是老版本snakeyaml的构造方法。

思考

其实这类问题很好解决,但是花了很长时间定位。

  1. method ()V 这种是构造函数报的错,理论自己应该推测出来时版本兼容问题
  2. 在搜索问题时丢失了异常的上下文,但也因此查到了是版本兼容问题,只是结果是springboot和snakeyaml的版本兼容
    https://github.com/spring-projects/spring-boot/issues/34405
  3. 再结合上下文是定位是apollo-client和snakeyaml的兼容问题

posted @ 2024-12-19 20:00  java渣渣  阅读(681)  评论(0)    收藏  举报