【问题标题】:Spring Boot Upgrade Error - Invalid bean definition with name org.springframework.transaction.config.internalTransactionalEventListenerFactorySpring Boot 升级错误 - 名称为 org.springframework.transaction.config.internalTransactionalEventListenerFactory 的 bean 定义无效
【发布时间】:2019-05-18 23:11:27
【问题描述】:

在基于 Java 的 Web 应用程序中尝试将 Spring Boot 升级到最新版本 2.1.1 并将 Spring 框架升级到 5.1.3,我收到以下错误

Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionalEventListenerFactory' defined in null

完整的堆栈跟踪如下。有关进一步故障排除的任何想法都会有所帮助

Failure starting application: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionalEventListenerFactory' defined in null: Cannot register bean definition [Root bean: class [org.springframework.transaction.event.TransactionalEventListenerFactory]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'org.springframework.transaction.config.internalTransactionalEventListenerFactory': There is already [Root bean: class [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=transactionalEventListenerFactory; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]] bound.
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:894)
    at org.springframework.beans.factory.support.BeanDefinitionReaderUtils.registerBeanDefinition(BeanDefinitionReaderUtils.java:166)
    at org.springframework.beans.factory.xml.ParserContext.registerBeanComponent(ParserContext.java:125)
    at org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser.registerTransactionalEventListenerFactory(AnnotationDrivenBeanDefinitionParser.java:111)
    at org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser.parse(AnnotationDrivenBeanDefinitionParser.java:63)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1366)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1352)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:179)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:149)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:96)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:513)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:393)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromImportedResources$0(ConfigurationClassBeanDefinitionReader.java:358)
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromImportedResources(ConfigurationClassBeanDefinitionReader.java:325)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:327)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:691)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:528)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)

谢谢!

更新 1

通过启用在 spring boot 2.1.0 RELEASE 中默认禁用的 bean 覆盖来抑制该问题

spring.main.allow-bean-definition-overriding=true

在此解决方法之后,应用程序启动失败并出现如下 OOM 错误

Application run failed java.lang.OutOfMemoryError: Requested array size exceeds VM limit

【问题讨论】:

  • 错误中提到了应用程序的类路径。介意将其添加到问题中吗?似乎以某种方式对 internalTransactionalEventListenerFactory 进行了双重引用。
  • 类路径涉及 100 多个第三方和特定于应用程序的库。顺便说一句,错误消息中的类不是我们在应用程序代码中配置的类或 bean。它看起来像是 Spring 事务管理内部的东西。
  • @AndyDufresne,你找到真正的问题了吗?
  • @PraveeshP - 因为这已经是一年多以前了,我不记得太多了,但我认为我们必须使用以下属性。

标签: java spring spring-boot


【解决方案1】:

在更新到 Spring Boot 2.1 后,我的测试遇到了类似的问题。在我的情况下,将属性spring.main.allow-bean-definition-overriding 设置为true 已解决。也许这对您的情况也有帮助。

【讨论】:

  • 是的,这确实解决了错误,但我想它只是暂时抑制了问题。我们如何排除故障并解决根本原因?
  • 嗨,很抱歉没有提供更多帮助,也许你有两个用 @EnableTransactionManagement 注释的类,这个注释加载 ProxyTransactionManagementConfiguration,这个定义了一个名为 internalTransactionalEventListenerFactory 的 Bean。如果是这种情况,您必须删除 @EnableTransactionManagement 注释之一或维护属性 allow-bean-definition-overriding 以允许 Spring Boot 像以前的版本一样工作。
  • 这帮助我让我的测试再次运行,但我同意 Andy 的观点,即在某些情况下需要另一种解决方案。但是,安迪,在您的情况下,这可能是完全正确的解决方案。没有更多的代码是不可能的。无论如何,在 Spring Boot 2.1 之前 Bean 覆盖是正确的,所以你的应用程序的行为应该保持不变。
猜你喜欢
  • 2019-09-20
  • 1970-01-01
  • 2019-04-08
  • 2015-03-18
  • 2019-10-12
  • 2017-06-02
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
相关资源
最近更新 更多