升级SnakeYAML与Spring Boot后遭遇Representer构造方法缺失错误求助
解决Spring Boot 2.7.10搭配SnakeYAML 2.0的NoSuchMethodError问题
问题原因
SnakeYAML 2.0对org.yaml.snakeyaml.representer.Representer类做了破坏性变更,移除了它的无参构造函数<init>()V,但Spring Boot 2.7.10依赖的Spring 5.3.x版本的YamlProcessor类仍在调用这个已被移除的构造方法,导致项目启动时抛出嵌套NoSuchMethodError的BeanDefinitionStoreException。
修复方案
方案一:降级SnakeYAML至兼容版本
Spring Boot 2.7.x的依赖管理体系默认适配SnakeYAML 1.33版本,该版本与Spring 5.3.x完全兼容。在pom.xml中显式指定该版本即可:
<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.33</version> </dependency>
方案二:升级Spring Boot到3.0+版本
Spring Boot 3.0及以上版本已适配SnakeYAML 2.x系列,若项目技术栈允许(需Java 17+),直接升级Spring Boot版本即可,依赖管理会自动匹配兼容的SnakeYAML版本,无需手动调整。
错误信息参考
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class nested exception is java.lang.NoSuchMethodError: org.yaml.snakeyaml.representer.Representer: method <init>()V not found at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.10.jar:2.7.10] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.10.jar:2.7.10] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.10.jar:2.7.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.10.jar:2.7.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.10.jar:2.7.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.10.jar:2.7.10] at Caused by: java.lang.NoSuchMethodError: org.yaml.snakeyaml.representer.Representer: method <init>()V not found at org.springframework.beans.factory.config.YamlProcessor.createYaml(YamlProcessor.java:187) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:164) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.config.YamlPropertiesFactoryBean.createProperties(YamlPropertiesFactoryBean.java:135) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.config.YamlPropertiesFactoryBean.getObject(YamlPropertiesFactoryBean.java:115) ~[spring-beans-5.3.20.jar:5.3.20] at at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:463) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:280) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:250) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:304) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:250) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:207) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:175) ~[spring-context-5.3.19.jar:5.3.19] ... 13 more
内容的提问来源于stack exchange,提问作者Welcome_back
相关产品推荐
相关产品推荐

