如何将属性值注入过滤器?

时间:2016-05-27 04:59:48

标签: java spring spring-mvc filter

我的问题很简单。我正在尝试将属性值注入过滤器。在我的控制器类中,我使用了以下代码,我可以成功注入属性:

@Controller
public class StatementController {
    @Value("${xapi.version}")
    private String version;
...
}

但是当我在自定义过滤器中使用相同的代码时,我在version属性中得到一个空值。这是代码:

public class HeaderFilter extends OncePerRequestFilter {

    @Value("${xapi.version}")
    private String version;
    private Logger logger = Logger.getLogger(this.getClass());

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
logger.error(version==null);
...

我正在使用springframework 4.0.9,这是我在web.xml中的过滤器配置的一个片段:

<filter>
        <filter-name>header</filter-name>
        <filter-class>com.application.HeaderFilter</filter-class>
    </filter>
<filter-mapping>
        <filter-name>header</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2 个答案:

答案 0 :(得分:5)

Spring @Value注入适用于由spring容器管理的bean(如控制器)。

此处,您的过滤器不是由spring容器管理,而是由Java EE容器管理。

您可以在init方法中恢复您的属性:

WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext()).getEnvironment().getProperty("xapi.version");

答案 1 :(得分:1)

您必须使用DelegatingFilterProxy来允许您的过滤器由Spring管理。它是一个特殊的代理,它执行查找根应用程序上下文的所有低级任务,获取bean并将所有请求转发给它。从javadoc中提取:

  

web.xml通常包含DelegatingFilterProxy定义,其指定的filter-name对应于Spring的根应用程序上下文中的bean名称。然后,所有对过滤器代理的调用都将委托给Spring上下文中的那个bean,这是实现标准Servlet过滤器接口所必需的。

所以你必须有一个类HeaderFilter的bean,你给它一个名字(比如header)并且你将web.xml文件中的过滤器声明更改为:

@Component

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