我正在尝试将一个spring bean注入过滤器,但无法使其正常工作。
注入的bean总是“null”。我成功地在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 { ... }
我缺少什么?谢谢!
答案 0 :(得分:9)
尝试显式定义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”)
为了让事情变得更漂亮,更容易处理,我会 camelCase 这个名称,并在任何地方将其重命名为“checkSession”(取消首字母大写)。
答案 1 :(得分:7)
适用于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