java - 将内部 bean 添加到应用程序上下文会抛出 No default constructorfound 异常

标签 java spring dynamic dependency-injection

我正在尝试以编程方式将内部 bean 添加到 jUnit 测试中的应用程序上下文中。我不想通过用 @Component 注解 bean 来污染我的上下文,因为它会影响在同一上下文中运行的所有其他测试。

public class PatchBaseImplTest extends TestBase{

    /**
     * Sample test patch to modify the schema
     */
    public class SchemaUpdatePatch extends PatchBaseImpl {
        public SchemaUpdatePatch(){
            super();
        }

        @Override
        public void applyPatch() throws Exception {
        }
    };

    @Before
    public void setUp(){
        // add patch to context
        beanRegistry.registerBeanDefinition("SchemaUpdatePatch",  SchemaUpdatePatch.class,  BeanDefinition.SCOPE_PROTOTYPE);
        schemaPatch = (Patch)applicationContext.getBean("SchemaUpdatePatch", SchemaUpdatePatch.class);

    }
}

其中registerBeanDefinition定义为:

    public void registerBeanDefinition( String name, Class clazz, String scope){
        GenericBeanDefinition definition = new GenericBeanDefinition();
        definition.setBeanClass(clazz);
        definition.setScope(scope);
        definition.setAutowireCandidate(true);
        definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);

        registry.registerBeanDefinition(name,  definition);
    }

我可以看到 bean defn 已添加到应用程序上下文中,但是当我尝试使用 appContext.getBean() 检索 bean 时,Spring 会抛出该类缺少构造函数的错误:

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ia.system.patch.PatchBaseImplTest$SchemaUpdatePatch]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.ia.system.patch.PatchBaseImplTest$SchemaUpdatePatch.<init>()
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1000)
    ... 35 more
Caused by: java.lang.NoSuchMethodException: com.ia.system.patch.PatchBaseImplTest$SchemaUpdatePatch.<init>()
    at java.lang.Class.getConstructor0(Class.java:2800)
    at java.lang.Class.getDeclaredConstructor(Class.java:2043)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78)
    ... 36 more

我尝试向 SchemaUpdatePatch 类添加默认构造函数,但这似乎并不重要。

但是,如果我用 @Component 对其进行注释,而不是以编程方式将其添加到上下文中,并尝试通过 applicationContext.getBean() 访问它,则它可以正常工作。

以编程方式将此 bean 添加到 applicationContext 的正确方法是什么?我的 GenericBeanDefinition 是错误的吗?我是否缺少一些内容来指定构造函数是什么?

最佳答案

写这篇文章实际上是一种宣泄。帮助我找到我的错误/错误。必须将内部类设为Static,否则Spring无法实例化它。希望这可以帮助其他人在未来。

即:

/**
 * Sample test patch to modify the schema
 */
static public class SchemaUpdatePatch extends PatchBaseImpl {
    public SchemaUpdatePatch(){
        super();
    }

    @Override
    public void applyPatch() throws Exception {
    }
};

关于java - 将内部 bean 添加到应用程序上下文会抛出 No default constructorfound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456461/

相关文章:

java - Spring 如何为 Maven 项目创建基本 URL

java - 错误 :(83, 42) java: 不兼容的类型: 从 float 到 int 可能有损转换

java - 如何防止 Gson 将长数字(一个 json 字符串)转换为科学记数法格式?

java - 由于原始 int 值而获取 OptionalDataException,但如何在 JAVA 中避免它

java - XmlBeanFactory 无法加载属性文件作为占位符?

Java-Spring-quartz :why is the job being fired in a loop?

java - Sonar runner 执行期间出错,在 play 项目的 junit 测试中运行 Sonar runner 2.3 时出现 java.lang.NullPointerException

c# - 使用 Linq to Entities 的装箱值

actionscript-3 - 从 ActionScript 中的另一个实例创建一个实例

java - 如何获取 Groovy 类的所有属性名称?