在配置</context:component-scan>中添加<context:component-scan ... =“”>时,Spring NoClassDefFoundError org.springframework.beans.FatalBeanException

时间:2011-12-24 20:51:48

标签: java spring

我正在编写一个简单的Spring 3.1测试,在配置中添加以下行时出现异常:

<context:component-scan base-package="com.software.shared" />

以下是例外:

INFO: Loading XML bean definitions from class path resource [spring-config.xml]
Exception in thread "main" java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.software.shared.PersonBeanTest.<init>(PersonBeanTest.java:15)
at com.software.shared.PersonBeanTest.main(PersonBeanTest.java:31)

我不知道发生了什么。如果我删除该行,则异常消失,但自动装配不起作用。

我在我的类路径上的Spring 3.1 RELEASE发行版中包含所有jar,包括org.springframework.beans-3.1.0.RELEASE.jar,我检查它是否包含该文件。 这是main方法中的代码:

package com.software.shared;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

@Service
public class PersonBeanTest {

    public PersonBeanTest() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //System.out.println("Name=" + ((PersonBean) (context.getBean("personBean"))).getName());
    }

    private PersonBean myBean;

    public PersonBean getMyBean() {
        return myBean;
    }

    @Autowired
    public void setMyBean(PersonBean myBean) {
        this.myBean = myBean;
    }

    public static void main(String[] args) {
        PersonBeanTest test = new PersonBeanTest();
        System.out.println("Name=" + test.getMyBean().getName());
    }
}

这是Spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    default-autowire="byName">

    <!-- <context:component-scan base-package="com.software" /> -->
    <!-- Register Annotation-based Post Processing Beans -->
    <context:annotation-config />

    <!-- Scan context package for any eligible annotation configured beans. -->
    <context:component-scan base-package="com.software.shared" />

    <bean id="personBean" class="com.software.shared.PersonBean">
        <property name="name" value="MyName" />
    </bean>

</beans>

我通过右键单击此类并单击“Run As - &gt; Java Application”来启动应用程序。 关于我为什么得到例外的任何想法?

5 个答案:

答案 0 :(得分:4)

您正尝试在 com.software.shared 包中创建spring scan class PersonBeanTest ,但同时您在的构造函数中创建相同的应用程序上下文PersonBeanTest ,我想这是异常的根本原因。

尝试扫描其他一些包:

<context:component-scan base-package="some.other.package" />

并使用以下代码段对其进行测试以确定其是否有效

public class PersonBeanTest {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        assertNotNull(context.getBean(PersonBean.class));
    }

}

答案 1 :(得分:1)

在我的情况下,这是因为StackOverflowError而发生的。在一些Spring catch块中,由于当前非常长的堆栈,FatalBeanException子类初始化再次失败,导致NoClassDefFoundError

答案 2 :(得分:0)

在不同情况下,我遇到了同样的问题。我不确定为什么会发生这种情况,但您应该能够通过在AbstractAutowireCapableBeanFactory内放置一个断点来找到原始异常。{/ 1}}。{/ p>

答案 3 :(得分:0)

请确保将spring-config.xml放入类路径中。

答案 4 :(得分:0)

我认为当您的ApplicationContext在启动时加载时,它会尝试使用其默认构造函数实例化Bean PersonBeanTest,您将在其中创建另一个ApplicationContext,它将再次尝试实例化同一个bean。此过程持续无限时间,最终抛出异常