【问题标题】:Bean marked with @Configuration fails in creation and fails startup of application标有@Configuration 的 Bean 创建失败,应用程序启动失败
【发布时间】:2016-09-13 20:08:40
【问题描述】:

我有一个使用 spring 4.1.0.RELEASE 创建的 Spring MVC 应用程序。我有一个类说 A 已用 @Configuration 标记以将其标记为配置类。

应用程序上下文中的 XML 配置如下

<bean id="a" class="A"></bean>

应用程序在启动时失败并出现以下错误。我正在使用带有 jetty 8 插件的 eclipse。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'a' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: A(class name)(Lorg/springframework/beans/factory/BeanFactory;)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:548)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:370)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1113)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1008)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:861)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:791)
at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:541)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:406)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:381)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:485)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:478)
at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1052)
at org.springframework.amqp.rabbit.core.RabbitAdmin.initialize(RabbitAdmin.java:356)
at org.springframework.amqp.rabbit.core.RabbitAdmin$11.onCreate(RabbitAdmin.java:323)
at org.springframework.amqp.rabbit.connection.CompositeConnectionListener.onCreate(CompositeConnectionListener.java:32)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:373)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createConnection(ConnectionFactoryUtils.java:80)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:130)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:67)
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:365)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1009)
at java.lang.Thread.run(Thread.java:745)

奇怪的是,该应用程序在我所有的队友系统上都能正常运行,但在我的系统上却不行。

任何帮助将不胜感激。

【问题讨论】:

  • 可能你的java版本和别人不一样?
  • 我们有一个项目特定的 java 设置,它使用 java 1.6 它在每个人的机器上都一样

标签: eclipse spring spring-mvc jetty-8


【解决方案1】:

如果加载的 jar 出现问题,则会发生 java.lang.NoSuchMethodError。我认为在您尝试运行此代码的机器上,已将 CLASSPATH 设置为加载旧版本 jar 的某个路径。

  1. 较低版本的 Spring jar 可能存在于您的共享文件夹或类路径中。

  2. 如果是 maven 项目,执行 mvn dependency:tree 并检查是否有其他依赖项正在加载较低版本的 spring。

  3. 您可以查看应用程序中加载的所有 jar 的路径。

public static void main(String[] args) {

URLClassLoader classLoader = (URLClassLoader)CurrentClass.class.getClassLoader(); System.out.println(Arrays.toString(classLoader.getURLs()));

}

【讨论】:

  • 1.我检查了类路径,但我没有看到 spring 2 的任何早期版本。它是一个 maven 项目,我在其上运行了依赖树命令,但找不到任何问题 3.我检查了 jar 的路径已加载到应用程序中,并且正在从我的本地 maven 存储库中加载
  • 我怀疑没有默认构造函数的父类加载器中存在其他 A 类。如果您可以在应用程序启动时调试代码,请将调试点保持在 AbstractAutowireCapableBeanFactory.doCreateBean() api 并在手表中使用 this.getClass().getClassLoader().loadClass("A") this 检查 A 类的类加载器。 getClass().getClassLoader().loadClass("A").getClassLoader()。请返回结果。
  • 启用调试器后,我尝试在控件到达 doCreateBean 内部时查看变量,但找不到从哪里获取该信息,并且我无法修改此类的源以添加该行你给的代码。我在 vm 参数中启用了详细模式,它可以加载类,但找不到任何可疑的东西,因为所有类都是从我的本地 .m2 加载的。我还观察到,spring 容器在加载上下文时首先创建 bean,然后在中途开始销毁它们,然后重新创建和缓存有问题的 bean,知道为什么吗?
  • 我能够得到值所以 this.getClass().getClassLoader().loadClass("A") -> class A 和 this.getClass().getClassLoader().loadClass(" A").getClassLoader() -> WebAppClassLoader=Spring MVC 应用程序。
  • 所以在你的 WebApp CL 中加载了一个类,所以从你的应用程序本身加载了一个类。那么现在,A类是否有任何超类或接口?你能提供一个类结构吗?
猜你喜欢
  • 1970-01-01
  • 2020-02-17
  • 2018-12-24
  • 2012-12-15
  • 2013-11-13
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多