2012-03-13 14 views
11

Sto provando a iniettare un bean spring in un filtro, ma non riesco a farlo funzionare.Spring e @Autowired su DelegatingFilterProxy

Il bean iniettato è sempre "null". Riesco ad automatizzare lo stesso bean in Controllers and HandlerInterceptors, quindi è correttamente annotato.

La classe di filtro è sotto lo stesso pacchetto base del resto dei controller.

Questa è la parte rilevante del mio web.xml

<filter> 
    <filter-name>CheckSession</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>CheckSession</filter-name> 
    <url-pattern>/panel/*</url-pattern> 
    </filter-mapping> 

Questo è il codice per il filtro

@Component 
public class CheckSession extends OncePerRequestFilter implements Filter { 

    @Autowired private Usuario usuario; 

    @Override 
    protected void doFilterInternal(
     HttpServletRequest request, 
     HttpServletResponse response, FilterChain chain) 
    throws ServletException, IOException { 

     // always null 
     System.out.println("autowired " + usuario); 
     chain.doFilter(request, response); 
    } 
} 

Il filtro è trigger su ogni richiesta.

Queste sono le annotazioni nel "Usuario" fagiolo

@Component 
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class Usuario implements java.io.Serializable { ... } 

Cosa mi manca? Grazie!

+0

shouldn stai usando il tuo esatto nome di classe in "filtro-classe"? E sei sicuro che il tuo filtro sia gestito da Spring? Non dovresti usare @Configurable qui? – skegg99

+0

Il nome del filtro è CheckSession, lo stesso indicato in "nome-filtro". Se cambio quel nome in "nome-filtro" ottengo un "NoSuchBeanDefinitionException" da Spring. Quindi suppongo di sì, il filtro è gestito da Spring (tramite DelegatingFilterProxy) ma il meccanismo di autowire continua a non funzionare ...:( – metacortechs

risposta

9

cercare di definire in modo esplicito il nome per il bean CheckSession e vedere se questo aiuta ... Ti piace questa:

@Component("CheckSession") 
public class CheckSession extends OncePerRequestFilter implements Filter { 
    @Autowired private Usuario usuario; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
      HttpServletResponse response, FilterChain chain) 
      throws ServletException, IOException { 

     // always null 
     System.out.println("autowired " + usuario); 
     chain.doFilter(request, response); 
    } 
} 

La parte fondamentale è questa: @Component ("CheckSession")

E per rendere le cose più carine e più facili da gestire lungo la strada, vorrei chiamare il nome camelCase e rinominarlo in "checkSession" ovunque (decapitalizzare la prima lettera).

+0

Questo ha funzionato per me e stavo avendo lo stesso problema – codemonkeyww

+1

Questo non funziona affatto.Tuttavia il filtro viene scansionato ma il lavoro ancora non funziona – Rahul

+0

+1 Funziona molto bene! –

7

Opere su Spring 3.2.6:

Primo: Nome componente, 2 opzioni - fare solo una

Opzione A:Annotazione - assume componente di scansione abilitato

@Component("checkSession") 
public class CheckSession extends OncePerRequestFilter { 

@Autowired 
Usuario usuario; 

@Override 
protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) throws ServletException, IOException { 

    // not null 
    System.out.println("autowired " + usuario); 
    chain.doFilter(request, response); 
    } 
} 

Opzione B:fagioli filo tramite appliationContext.xml

<bean id="checkSession" class="com.example.filter.CheckSession"></bean> 

Secondo: filo fino primavera DelegatingFilterProxy

<filter> 
    <filter-name>checkSession</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

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

Note: il nome del bean viene fatto riferimento come il filter-name

+0

Sto affrontando lo stesso problema Sto usando spring-boot Come configurare il filtro in spring-boot visto che non ho web.xml da configurare filtro come questo? – kaluva

Problemi correlati