2012-03-13 43 views
11

Estoy tratando de inyectar un grano de primavera en un filtro, pero no puedo hacerlo funcionar.Spring y @Autowired en DelegatingFilterProxy

El bean inyectado siempre es "nulo". Tengo éxito en autoverificar este mismo bean en Controladores y HandlerInterceptors, por lo que está anotado correctamente.

La clase de filtro está debajo del mismo paquete base del resto de los Controladores.

Esta es la parte relevante de mi 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> 

Este es el código para el 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); 
    } 
} 

El filtro está provocando en cada petición.

Estas son las anotaciones en el frijol "Usuario"

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

¿Qué me falta? ¡Gracias!

+0

no deben ¿Usas tu nombre de clase exacto en 'filter-class'? ¿Y está seguro de que su filtro está gestionado por Spring? ¿No deberías usar @Configurable aquí? – skegg99

+0

El nombre del filtro es CheckSession, el mismo que se indica en "nombre-filtro". Si cambio ese nombre en "filtro-nombre" obtengo una "NoSuchBeanDefinitionException" de Spring. Así que supongo que sí, el filtro está siendo administrado por Spring (a través de DelegatingFilterProxy) pero el mecanismo de autowire aún no funciona ...:( – metacortechs

Respuesta

9

tratar de definir explícitamente el nombre para su frijol CheckSession y ver si eso ayuda ... De esta manera:

@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 clave es la siguiente: @Component ("CheckSession")

Y para hacer las cosas más lindas y fáciles de manejar en el futuro, yo llamaría camelCase al nombre y lo cambiaría a "checkSession" en todas partes (descartando la primera letra).

+0

Esto funcionó para mí y tuve el mismo problema. – codemonkeyww

+1

Esto no funciona en absoluto. Aunque el filtro se escanea pero el autoajuste aún no funciona – Rahul

+0

+1 ¡Funciona muy bien! –

7

Obras en primavera 3.2.6:

Primero: Nombre su componente, 2 opciones - hacer sólo una

Opción A:anotación - asume la exploración componente habilitado

@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); 
    } 
} 

Opción B:bean de alambre a través de appliationContext.xml

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

Segundo: alambre hasta la 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> 

Notas: el nombre de frijol se hace referencia como la filter-name

+0

Estoy enfrentando el mismo problema. Estoy usando Spring-boot. Cómo configurar el filtro en Spring-boot ya que no tengo web.xml para configurar filtro como este? – kaluva

Cuestiones relacionadas