2017-05-03 1 views
0

web.xml:Frühling Injektion in Filter Implementierung abgebildet in web.xml

<filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>com.mypackage.MyFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/myFilterPattern/*</url-pattern> 
</filter-mapping> 

MyFilter:

public class MyFilter implements Filter { 

    @Autowired 
    InjectedBean someInjectedBean; 

Wenn jedoch das Abfangen /myFilterPattern/* Anfragen, someInjectedBean in MyFilter.doFilter(...) noch null ist, was bedeutet, es hat nicht injiziert worden. Dieselbe Bean (InjectedBean) wird in anderen Kontextkomponenten, die in web.xml nicht referenziert sind, ordnungsgemäß eingefügt.

Liegt das daran, dass die Containerfilterung außerhalb des Spring-Kontextes stattfindet? Gibt es eine Möglichkeit, eine Spring-Injektion in der Filterimplementierung in web.xml zu erstellen?

Antwort

2

Da Filter keine Frühlingsbohne ist (es ist eine Webkomponente), funktionieren die Injektionen nicht in ihnen. Federn werden nicht in die Bahnkomponente injizieren.

Verwenden Sie einen DelegatingFilterProxy, dies ist eine Filterimplementierung, die einen Springbean-Namen als init-Parameter verwendet und die Filteranforderung an diese Bean delegiert.

<filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
    <param-name>targetBeanName</param-name> 
    <param-value>myFilterBean<param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/myFilterPattern/*</url-pattern> 
</filter-mapping> 

Und erstellen Sie eine Bean mit dem Namen customFilterBean in Ihrem Frühling Kontext.

public class MyFilter extends GenericFilterBean { 

    @Autowired 
    InjectedBean someInjectedBean; 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
     chain.doFilter(request, response); 
    } 
} 
+0

meinst du "eine Bohne mit dem Namen ** myFilterBean ** in deinem Frühlingskontext erstellen"? – amphibient

+0

Ja Erstellen Sie eine Bean mit dem Namen myFilterBean vom Typ MyFilter. MyFilter kann GenericFilterBean erweitern. –

+0

was denken Sie, sollte der Umfang dieser Bohne im Zusammenhang sein? Sitzung? – amphibient

Verwandte Themen