2014-11-03 3 views
4

Я пытаюсь использовать java config в приложении webmvc весной 4. После просмотра некоторых примеров в Интернете у меня есть следующий WebAppApplicationInitializer.Добавление слушателя в контекст сервлета в Spring

public class AppInit implements WebApplicationInitializer { 
    private static final String CONFIG_LOCATION = "spring.examples.config"; 
    private static final String MAPPING_URL = "/rest/*"; 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     WebApplicationContext context = getContext(); 
     servletContext.addListener(new ContextLoaderListener(context)); 
     ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping(MAPPING_URL); 
    } 

    private AnnotationConfigWebApplicationContext getContext() { 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.setConfigLocation(CONFIG_LOCATION); 
     return context; 
    } 

Он отлично работает в причалу, котом, но когда я использую смолы 4.0.40. веб-сервер показывает следующее сообщение об ошибке:

java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml! at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:277) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) at com.caucho.server.webapp.WebApp.fireContextInitializedEvent(WebApp.java:3777) at com.caucho.server.webapp.WebApp.startImpl(WebApp.java:3687) at com.caucho.server.webapp.WebApp.access$400(WebApp.java:207) at com.caucho.server.webapp.WebApp$StartupTask.run(WebApp.java:5234) at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173) at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)

Когда я закомментировать эту строку

servletContext.addListener(new ContextLoaderListener(context)); 

все работает отлично.

Вопрос: Какова цель добавления слушателя в контекст сервлета? Неправильно ли не добавлять слушателя в контекст сервлета?

+0

Почему вы не определяете слушателя через web.xml и таким образом разрешите контейнеру обрабатывать его? – SMA

+0

Я хотел бы иметь веб-приложение без каких-либо конфигураций xml –

+0

Не могли бы вы показать полное сообщение об ошибке с классом, который его выбрал? –

ответ

1

Проблема была в ошибке http://bugs.caucho.com/view.php?id=5611 в смоле 4.0.40. ServletContextListener#contextInitialized() называется дважды. В смоле 4.0.41 все работает нормально