2010-03-10 12 views
23

I Spring-Beans in meinem ServletsZugriff auf Spring-Beans von Servlet-Filter und Tags

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

in dem init Methode des Servlets.

Ich frage mich, gibt es ein Äquivalent der WebApplicationContext für Servlet-Filter? Ist es auch möglich, auf Spring-Beans in einer Tag-Klasse zuzugreifen?

Antwort

37

Für Filter - verwenden Filter.init():

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

Für tags - verwenden TagSupport.pageContext (beachten Sie, dass es in SimpleTagSupport nicht verfügbar ist):

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

Ich glaube, ich werde ein dummer oder offensichtlich machen Frage (Ich möchte jetzt Zeit verbringen, um danach zu suchen), aber ich werde es trotzdem tun: wi Soll der Kontext immer (bei jedem Lauf) in der init-Methode eines Filters bereit sein? Unabhängig von der Antwort wird eine nachweisbare Argumentation geschätzt. Danke – reallynice

+4

@niconic: Der Anwendungskontext wird von 'ContextLoaderListener' initialisiert, und alle Servlet Context Listeners werden vor der Initialisierung des' Filters 'gemäß Servlet API Specification 3.0, Abschnitt 10.12 Web Application Deployment aufgerufen. – axtavt

+0

axtavt, Perfekt, genau das, was ich gesucht habe, vielen Dank – reallynice

26

können Sie eine DelegatingFilterProxy verwenden, wie im Frühjahr Dokumentation erwähnt: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html#delegating-filter-proxy

Sie müssen nur Ihre echten Filter Bohne mit dem gleichen Namen wie die Bohne Filter-Namen in web.xml erklärt erklären:

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

Gibt es ein Beispiel dafür, wie dies mithilfe der Java-Konfiguration ohne die Datei web.xml src erreicht wird? – Snekse

2

Es gibt ein paar Möglichkeiten, um es

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

  2. WebApplicationContext springContext = RequestContextUtils.getWebApplicationContext(servletRequest)

dann

springContext.getBean("myBeanId");