2010-07-02 7 views
9

Tengo Spring ApplicationContext donde declaro bean de servidor Jetty y lo inicio. Dentro de Jetty tengo un DispatcherServlet y un par de controladores. ¿Cómo hacer que ese DispatcherServlet y sus controladores usen beans del mismo ApplicationContext donde se declara Jetty?¿Cómo incrustar Jetty en Spring y hacer que use el mismo AppContext en el que estaba incrustado?

De hecho, en ese contexto externo tengo un par de frijoles similares a daemon y sus dependencias. Los controladores dentro de Jetty usan las mismas dependencias, así que me gustaría evitar duplicarlos dentro y fuera de Jetty.

Respuesta

5

Hice esto hace un tiempo.

Spring documentation sugiere que utilice un ContextLoaderListener para cargar el contexto de la aplicación para los servlets. En lugar de esta clase de primavera, usa tu propio oyente. La clave aquí es que su oyente personalizado se puede definir en la configuración de Spring y puede conocer el contexto de la aplicación en el que está definido; entonces, en lugar de cargar un nuevo contexto de aplicación, simplemente devuelve ese contexto.

El oyente sería algo como esto:

public class CustomContextLoaderListener extends ContextLoaderListener implements BeanFactoryAware { 

    @Override 
    protected ContextLoader createContextLoader() { 
     return new DelegatingContextLoader(beanFactory); 
    } 

    protected BeanFactory beanFactory; 

    @Override 
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
     this.beanFactory = beanFactory; 
    } 

} 

y la DelegatingContextLoader hace esto:

public class DelegatingContextLoader extends ContextLoader { 

    protected BeanFactory beanFactory; 

    public DelegatingContextLoader(BeanFactory beanFactory) { 
     this.beanFactory = beanFactory; 
    } 

    @Override 
    protected WebApplicationContext createWebApplicationContext(ServletContext servletContext, ApplicationContext parent) throws BeansException { 
     return new GenericWebApplicationContext((DefaultListableBeanFactory) beanFactory); 
    } 

} 

Es un poco complicado, y probablemente se puede mejorar, pero esto ha funcionado para mí.

+1

Gracias! Después de algunas modificaciones, resolví mi problema. Con esta solución obtuve la excepción 'ApplicationEventMulticaster not initialized', porque' GWAC' no se reescribió, pero cuando llamé a 'refresh()', obtuve una excepción sobre la segunda llamada de los postprocesadores. Así que, en lugar de usar 'GWAC', creé una clase' WrapperWebApplicationContext' que delegaba todas las llamadas a 'ApplicationContext' pasadas en el constructor. Ahora funciona perfectamente. Además, anulé 'createWebApplicationContext' of' ContextLoaderListener' - de esta manera no hay necesidad de usar la clase 'ContextLoader'. – Fixpoint

+0

Ok. Estoy perplejo. ¿Cómo se obtiene el contenedor de servlets para usar el bean Listener que se ha definido en su configuración de Spring en lugar de crear una nueva instancia que no sabe nada acerca de applicationContext/beanFactory? – CupawnTae

Cuestiones relacionadas