2010-03-10 10 views
23

posso accedere bean Spring nei miei servlet utilizzandofagioli Accesso scaturire da filtri servlet e tag

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

nel metodo del Servlet init.

Mi chiedevo se esistesse un equivalente del WebApplicationContext per i filtri servlet? Inoltre, è possibile accedere ai bean Spring in una classe tag?

risposta

37

Per i filtri - utilizzare Filter.init():

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

Per i tag - utilizzare TagSupport.pageContext (si noti che non è disponibile in SimpleTagSupport):

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

sento che sto andando a fare una stupida o evidenti domanda (mi piacerebbe passare il tempo ora per cercarlo), ma lo farò comunque: wi ll contesto deve essere sempre (ad ogni esecuzione) pronto nel metodo init di un filtro? Indipendentemente dalla risposta, è apprezzata un'argomentazione dimostrabile. Grazie – reallynice

+4

@niconic: il contesto dell'applicazione viene inizializzato da 'ContextLoaderListener' e tutti i listener del contesto servlet vengono richiamati prima dell'inizializzazione di' Filter's, come da Specifica API API servlet 3.0, sezione 10.12 Distribuzione applicazioni Web. – axtavt

+0

axtavt, Perfect, esattamente quello che stavo cercando, grazie mille – reallynice

26

è possibile utilizzare un DelegatingFilterProxy come accennato nella documentazione Primavera: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html#delegating-filter-proxy

Non vi resta che dichiarare il bean filtro vero e proprio con lo stesso nome di fagioli come il filtro-nome dichiarato in 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

Esiste un esempio di come questo viene realizzato utilizzando la configurazione Java senza il file src web.xml? – Snekse

2

ci sono un paio di modi per farlo

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

  2. WebApplicationContext springContext = RequestContextUtils.getWebApplicationContext(servletRequest)

poi

springContext.getBean("myBeanId");