2010-03-10 11 views
23

puedo tener acceso granos de primavera en mis servlets utilizandogranos de Acceso a la primavera de filtros de servlets y etiquetas

WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 

en el método del servlet init.

Me preguntaba ¿existe un equivalente de WebApplicationContext para filtros de servlet? Además, ¿es posible acceder a Spring beans en una clase de etiqueta?

Respuesta

37

Para los filtros - utilizar Filter.init():

public void init(FilterConfig config) { 
    WebApplicationContext springContext = 
     WebApplicationContextUtils.getWebApplicationContext(config.getServletContext()); 
} 

Para las etiquetas - utilizar TagSupport.pageContext (tenga en cuenta que no es disponible en SimpleTagSupport):

WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext()); 
+1

Siento que voy a hacer una estúpida o evidente pregunta (me gustaría pasar tiempo ahora para buscarla), pero lo haré de todos modos: wi ¿El contexto estará siempre (en cada ejecución) listo en el método init de un filtro? Independientemente de la respuesta, se aprecia una argumentación demostrable. Gracias – reallynice

+4

@niconic: el contexto de la aplicación se inicializa mediante 'ContextLoaderListener', y todas las escuchas de contexto de servlet se invocan antes de la inicialización del' Filter's, según la especificación de API de servlet 3.0, sección 10.12 Despliegue de la aplicación web. – axtavt

+0

axtavt, perfecto, exactamente lo que estaba buscando, muchas gracias – reallynice

26

puede utilizar un DelegatingFilterProxy como se menciona en la documentación de primavera: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html#delegating-filter-proxy

Sólo tiene que declarar su grano de filtro real con el mismo nombre del bean como el filtro de nombre declarado en web.xml:

Web .xml:

<filter> 
     <filter-name>SpringTestFilter</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>SpringTestFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

applicationContext.xml:

<bean id="SpringTestFilter" class="com.company.app.servlet.SpringTestFilter" /> 
+0

¿Hay algún ejemplo de cómo se logra esto usando la configuración de Java sin ningún archivo web.xml src? – Snekse

2

Hay un par de maneras de conseguirlo

  1. WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getFilterCongig().getServletContext());

  2. WebApplicationContext springContext = RequestContextUtils.getWebApplicationContext(servletRequest)

continuación

springContext.getBean("myBeanId"); 
Cuestiones relacionadas