2009-01-21 9 views
24

Deseo escribir un servlet simple en JBoss que invoque un método en un bean de resorte. El objetivo es permitir que un usuario inicie un trabajo interno al presionar una URL.Acceso a los granos de muelles de un servlet en JBoss

¿Cuál es la forma más fácil de obtener una referencia a mi Spring Bean en el servlet?

Los servicios web de JBoss le permiten inyectar un WebServiceContext en su clase de servicio utilizando una anotación @Resource. ¿Hay algo comparable que funcione en servlets simples? Un servicio web para resolver este problema en particular usaría un mazo para aplastar una nuez.

Respuesta

31

Su servlet puede utilizar WebApplicationContextUtils para obtener el contexto de aplicación, pero luego su código de servlet tendrá una dependencia directa de la Spring Framework.

Otra solución es configurar el contexto de aplicación para exportar el grano de la primavera con el contexto servlet como un atributo:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter"> 
    <property name="attributes"> 
    <map> 
     <entry key="jobbie" value-ref="springifiedJobbie"/> 
    </map> 
    </property> 
</bean> 

Su servlet puede recuperar el grano del contexto servlet utilizando

SpringifiedJobbie jobbie = (SpringifiedJobbie) getServletContext().getAttribute("jobbie"); 
+0

Bien, gracias. –

+0

¿Cuál es la ventaja de hacerlo de esta manera y no usar WebApplicationContextUtils? De cualquier manera está ligado a Spring. – Elliot

+5

El mecanismo para llenar el atributo de contexto de servlet no tiene que implementarse usando Spring. Un filtro u otro servlet que se ejecuta al inicio puede llenar el atributo de contexto de servlet. –

7

he encontrado una manera de hacerlo:

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 
SpringifiedJobbie jobbie = (SpringifiedJobbie)context.getBean("springifiedJobbie"); 
58

Hay es una forma mucho más sofisticada de hacer eso. Hay SpringBeanAutowiringSupport dentro org.springframework.web.context.support que permite la construcción de algo como esto:

public class MyServlet extends HttpServlet { 

    @Autowired 
    private MyService myService; 

    public void init(ServletConfig config) { 
    super.init(config); 
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, 
     config.getServletContext()); 
    } 
} 

Esto hará que la primavera para buscar el ApplicationContext ligada a la ServletContext (por ejemplo, creada a través de ContextLoaderListener) e inyectar los granos de la primavera disponibles en ese ApplicationContext.

+4

En Spring 2.5.x debería ser SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); que maneja el resto automáticamente Consejo impresionante por cierto. – Lajcik

+1

Si necesita acceder a cualquiera de ServletConfig, asegúrese de llamar a "super.init (config)" en el método "init"; p. public void init (configuración ServletConfig) { super.init (config); SpringBeanAutowiringSupport.processInjectionBasedOnServletContext (this, config.getServletContext()); } – tamsler

+0

¡Gracias por la pista, buena captura! –

Cuestiones relacionadas