5

Ich habe eine spring-boot Anwendung.Wie man Bean in den Servlet-Filtern in der Frühlingsanwendung autowire?

Ich habe keine ApplicationContext.xml oder web.xml Dateien in meinem Projekt. Ich bevorzuge es, sie zu vermeiden und habe alles in Java-Code konfiguriert.

Ich habe die Beiträge über Bean-Injektion in Servlet-Filter gelesen.

  1. How can I get a Spring bean in a servlet filter?

  2. http://www.deadcoderising.com/2015-05-04-dependency-injection-into-filters-using-delegatingfilterproxy/

  3. spring injection in servlet filter

Nachdem sie zu lesen, begann ich DelegatingFilterProxy zu verwenden.

Meine Frage ist, wie autowire die Bean in Filter und vermeiden Sie die Verwendung von xml Dateien speziell für DelegatingFilterProxy Konfiguration.

Der snipped Code ist aus dem zweiten Pfosten zur Verfügung gehostet in github.

public class AuditHandler { 

    public void auditRequest(String appName, ServletRequest request) { 
     System.out.println(appName + ": Received request from " + request.getRemoteAddr()); 
    } 
} 

public class AuditFilter implements Filter { 

    private final AuditHandler auditHandler; 
    private String appName; 

    public AuditFilter(AuditHandler auditHandler) { 
     this.auditHandler = auditHandler; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

     auditHandler.auditRequest(appName, request); 
     chain.doFilter(request, response); 
    } 

    public void init(FilterConfig filterConfig) throws ServletException { 
     appName = filterConfig.getInitParameter("appName"); 
    } 

    public void destroy() {} 
} 

ApplicationContext.xml 

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd"> 


    <bean id="auditHandler" class="com.deadcoderising.AuditHandler"> 
    </bean> 

    <bean id="auditFilter" class="com.deadcoderising.AuditFilter"> 
     <constructor-arg ref="auditHandler"/> 
    </bean> 
</beans> 

web.xml 

<web-app version="3.0" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     metadata-complete="true"> 

    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:applicationContext*.xml</param-value> 
    </context-param> 


    <filter> 
     <filter-name>auditFilter</filter-name> 
     <filter-class> 
      org.springframework.web.filter.DelegatingFilterProxy 
     </filter-class> 
     <init-param> 
      <param-name>targetFilterLifecycle</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <init-param> 
      <param-name>appName</param-name> 
      <param-value>di-example</param-value> 
     </init-param> 
    </filter> 

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

</web-app> 

Antwort

6

Sie sollten eine FilterRegistrationBean auf Ihre Hauptanwendungsklasse (Klasse mit @SpringBootApplication kommentierten) hinzufügen und lassen den Frühling Instanz der AuditHandler bieten:

Wenn dies nicht funktioniert (z. B. Ihre AuditHandler Implementierung ist nicht ordnungsgemäß mit Anmerkungen versehen oder es befindet sich nicht auf dem standardmäßigen Scanpfad des Pakets), können Sie Sp Ring, um es (auch in Ihrer @SpringBootApplication annotierten Klasse):

@Bean 
public AuditHandler auditHandler() { 
    return new AuditHandlerImplementation(); 
} 
+0

Wenn ich eine Reihe von Filtern angewendet werden, wie ist die Reihenfolge angegeben? –

+0

'FilterRegistrationBean # setOrder (int)', ich habe die Antwort aktualisiert. – mzc

+0

Danke, ich werde dies jetzt testen –

Verwandte Themen