【问题标题】:WebApplicationInitializer called twiceWebApplicationInitializer 调用了两次
【发布时间】:2016-09-03 02:46:17
【问题描述】:

我正在使用 Spring MVC 和 ZK 框架创建一个网络应用程序。我有一个包含 spring 和 zk 的所有基本配置的根项目(jar),以及一个调用初始化程序的 web 应用程序项目(war)。

这是我根项目中的初始化程序

public class DefaultInitializer implements WebApplicationInitializer {

    private Class<?> config;

    public void onStartup(ServletContext container) throws ServletException {
        init();

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(config);

        // Manage the lifecycle of the root application context
        container.addListener(new ContextLoaderListener(rootContext));
        container.addListener(new RequestContextListener());
        container.addListener(new HttpSessionListener());

        // Register and map the dispatcher servlet
        ServletRegistration.Dynamic dispatcher = container.addServlet(
                "mvc", new DispatcherServlet(rootContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");

        ServletRegistration.Dynamic zkDispatcher = container.addServlet(
                "zkLoader", new DHtmlLayoutServlet());
        zkDispatcher.setLoadOnStartup(2);
        zkDispatcher.setInitParameter("update-uri", "/zkau");
        zkDispatcher.addMapping("*.zul");
        zkDispatcher.addMapping("*.zhtml");
        zkDispatcher.addMapping("/zk/*");

        ServletRegistration.Dynamic zkUpdater = container.addServlet(
                "auEngine", new DHtmlUpdateServlet());
        zkUpdater.setLoadOnStartup(3);
        zkUpdater.addMapping("/zkau/*");

    }

    protected void setConfig(Class<?> config) {
        this.config = config;
    }

    protected void init() {
        setConfig(BaseConfig.class);
    }

}

所以在我的 webapp 项目中我只需要这样做

public class Initializer extends DefaultInitializer {

    @Override
    public void init() {
        setConfig(WebConfig.class);
    }

}

其中 WebConfig 是 ComponentScan 和 EnableWebMvc Java 配置。

问题是当我使用网络应用程序启动我的服务器时。 onStartup 被调用两次,然后抛出 NullPointerException。

我只有一个web.xml,我也只注册了一个DispatcherServlet,在我的pom中只导入了一个spring-web.jar。

我正在使用 Spring 4、Java 1.8 和 Tomcat v.8

谁能告诉我发生了什么?

谢谢,

J.

【问题讨论】:

    标签: java spring spring-mvc tomcat


    【解决方案1】:

    问题出在 DefaultInitializer 类的定义中。

    DefaultInitializer 应该是abstract,因此当 Initializer 扩展 DefaultInitializer 时,只会创建一个实现 WebApplicationInitializer 的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-25
      • 2013-01-21
      • 2012-09-08
      • 2016-04-27
      • 2019-02-27
      • 1970-01-01
      • 2019-12-04
      • 2018-09-15
      相关资源
      最近更新 更多