如何使用WebApplicationInitializer初始化dispatcherServlet?

时间:2013-04-12 10:39:22

标签: spring-mvc web jetty tomcat7

我使用WebApplicationInitializer搜索了一些代码,用于no-web.xml配置。

这些代码格式相同。

  1. 创建rootContext
  2. 创建ContextLoaderListener
  3. 注册servlet的监听器
  4. 这是代码块

        @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        registerListener(servletContext);
        registerDispatcherServlet(servletContext);
    }
    
    private void registerListener(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext rootContext = createContext(DomainConfiguration.class);
        ContextLoaderListener contextLoaderListener = new ContextLoaderListener(rootContext);
        servletContext.addListener(contextLoaderListener);
        servletContext.addListener(new RequestContextListener());
    }
    
    private void registerDispatcherServlet(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext dispatcherContext = createContext(WebMvcContexConfiguration.class);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet(DISPATCHER_SERVLET_NAME,
                new DispatcherServlet(dispatcherContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
    
    private AnnotationConfigWebApplicationContext createContext(final Class<?>... annotatedClasses) {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(annotatedClasses);
        return context;
    }
    

    但是,此代码无效。它无法在根上下文中找到上下文对象。 所以,我已经改变了一些代码,它正在发挥作用。

    这是工作代码。

        private void registerListener(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext rootContext = createContext(DomainConfiguration.class);
        ContextLoaderListener contextLoaderListener = new ContextLoaderListener(rootContext);
        // This is changed code!!
        contextLoaderListener.initWebApplicationContext(servletContext);
        servletContext.addListener(new RequestContextListener());
    }
    

    是不是?我在spring help doc中看到了第一个代码。但它不适用于码头9。

2 个答案:

答案 0 :(得分:1)

您使用的是哪种版本的jetty-9?在jetty-9.0.0.RC3中修复了一个问题(参考:https://bugs.eclipse.org/bugs/show_bug.cgi?id=400312),这意味着将不会调用由这种代码添加的任何侦听器。请尝试使用jetty-9.0.1版本的原始代码。如果它不起作用,请提出错误并在码头问题跟踪器中包含代码示例:https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Jetty

答案 1 :(得分:0)

这是码头的问题。 Jetty无法使用ContextLoaderListener初始化rootContext。

我不知道原因。但是tomcat7现在正在运行。