问题 Spring和@Autowired在DelegatingFilterProxy上


我正在尝试将一个spring bean注入过滤器,但无法使其工作。

注入的bean总是“空”。我成功地在Controllers和HandlerInterceptors中自动装配这个相同的bean,因此它被正确注释。

过滤器类与其余控制器的基本包相同。

这是我的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>

这是过滤器的代码

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

过滤器在每个请求时触发。

这些是“Usuario”bean中的注释

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

我错过了什么?谢谢!


10706
2018-03-13 19:31


起源

你不应该在'filter-class'中使用你的确切类名吗?你确定你的过滤器是由Spring管理的吗?你不应该在这里使用@Configurable吗? - skegg99
过滤器的名称是CheckSession,与“filter-name”中指示的名称相同。如果我在“filter-name”中更改了该名称,我将从Spring获得“NoSuchBeanDefinitionException”。所以我想是的,过滤器是由Spring(通过DelegatingFilterProxy)管理,但autowire机制仍然无法正常工作... :( - metacortechs


答案:


尝试显式定义CheckSession bean的名称,看看是否有帮助...像这样:

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

关键部分是:@Component(“CheckSession”)

为了让事情变得更漂亮,更容易处理,我愿意 骆驼香烟盒 名称并将其重命名为“checkSession”(去大写第一个字母)。


9
2018-03-23 16:35



这对我有用,我遇到了同样的问题。 - codemonkeyww
这根本不起作用。虽然过滤器被扫描但是自动装置仍然不起作用 - Rahul
+1在这里工作得非常好! - Łukasz Kidziński
@Rahul只有在使用org.springframework.web.filter.DelegatingFilterProxy时才有效 - Italo Borssatto


适用于Spring 3.2.6:

第一: 为您的组件命名,2个选项 - 只做一个

选项A:  注解  - 假设 组件扫描 启用

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

选项B:  通过appliationContext.xml连接bean

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

第二: 连接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>

注意:bean名称被引用为 filter-name


7
2018-01-20 18:55



我面临同样的问题。我正在使用弹簧靴。如何在spring-boot中配置过滤器,因为我没有web.xml来配置这样的过滤器? - kaluva