Spring and @Autowired on a DelegatingFilterProxy

后端 未结 2 446
你的背包
你的背包 2021-01-04 12:46

I\'m trying to inject a spring bean into a filter, but can\'t make it work.

The bean injected is always \"null\". I succeed autowiring this same bean in Controllers

相关标签:
2条回答
  • 2021-01-04 12:57

    Try to explicitly define the name for your CheckSession bean and see if that helps... Like this:

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

    The key part is this: @Component("CheckSession")

    And to make things prettier and easier to deal with down the road, I would camelCase the name and rename it to "checkSession" everywhere (de-capitalize first letter).

    0 讨论(0)
  • 2021-01-04 13:04

    Works on Spring 3.2.6:

    First: Name your component, 2 options - do only one

    Option A: Annotation - assumes component scanning enabled

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

    Option B: wire bean via appliationContext.xml

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

    Second: Wire up Spring 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>
    

    Notes: the bean name is referenced as the filter-name

    0 讨论(0)
提交回复
热议问题