5

Ho un'applicazione spring-boot.come attivare il bean nei filtri servlet nell'applicazione Spring?

Non ho file ApplicationContext.xml o web.xml nel mio progetto. Preferisco evitarli e avere tutto configurato in codice Java.

Ho letto i seguenti post sull'iniezione di bean nei filtri di servlet.

  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

Dopo averle lette, ho iniziato ad usare DelegatingFilterProxy.

La mia domanda è come autowire il bean nel filtro ed evitare di utilizzare i file xml in particolare per la configurazione DelegatingFilterProxy.

Il codice snipped è disponibile dal secondo post ospitati 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> 

risposta

6

Si dovrebbe aggiungere un FilterRegistrationBean alla classe di applicazione principale (classe annotato con @SpringBootApplication) e lasciare Primavera fornire istanza del AuditHandler:

Se ciò non funziona (ad esempio l'implementazione dello AuditHandler non è annotata correttamente o non si trova nel percorso di scansione del pacchetto predefinito) è possibile istruire Sp squillare per fornirlo (anche nella classe annotata @SpringBootApplication):

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

se ho un numero di filtri da applicare, come viene specificato l'ordine? –

+0

'FilterRegistrationBean # setOrder (int)', Ho aggiornato la risposta. – mzc

+0

Grazie, lo verificherò ora –