Spring为什么无法实例化我的自定义ApplicationContext?

时间:2019-02-16 22:00:30

标签: java spring

这是我的代码减少到最小可重复的情况:

@SpringBootApplication
@public class IfserverApplication {

    private class AppContext extends AnnotationConfigServletWebServerApplicationContext {
    }

    public static void main(String[] args) {
        new Configurator("IFServer");
        try {
            SpringApplication app = new SpringApplication(IfserverApplication.class);
            app.setApplicationContextClass(AppContext.class);
            app.run(args);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

}

这是我遇到的错误:

Caused by: java.lang.NoSuchMethodException: com.inlet.ifserver.IfserverApplication$AppContext.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_192]
    at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_192]
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:122) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE]
    ... 3 common frames omitted

这似乎是在说我的AppContext类没有默认构造函数。但是,当然,仅此而已。我尝试过显式添加默认的(无参数)构造函数,但这无济于事,无论如何这是没有必要的。

我认为有人可能只看代码就能告诉我什么地方出了问题,但我认为通过进一步调试我的调试器来提供我所看到的内容并不会受到伤害...

我已经调试到代码失败的地方。这是该代码段:

try {
    return instantiateClass(clazz.getDeclaredConstructor());
} catch (NoSuchMethodException var3) {
    Constructor<T> ctor = findPrimaryConstructor(clazz);
    if (ctor != null) {
        return instantiateClass(ctor);
    } else {
        throw new BeanInstantiationException(clazz, "No default constructor found", var3);
    }
} catch (LinkageError var4) {
    throw new BeanInstantiationException(clazz, "Unresolvable class definition", var4);
}

尝试查找构造函数时,第一个catch块被命中。这是奇怪的地方。这并不是失败,因为对“ clazz.getDeclaredConstructor”的调用引发了异常。它似乎失败了,因为'clazz.getDeclaredConstructor'方法不存在! ?? “ clazz”是一个java.lang.Class对象。显然应该有这种方法。

enter image description here

是不是该方法是内置C方法,还是我的IntelliJ调试器看不到它?

假设我的调试器很困惑,为什么这段代码无法通过查找其默认构造函数实例化我的类呢?

1 个答案:

答案 0 :(得分:2)

尝试将AppContext设为静态

    private static class AppContext extends AnnotationConfigServletWebServerApplicationContext 

对于非静态内部类,将隐式引用外部类。我相信这会导致创建与no-arg签名不匹配的综合构造函数。