Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将属性值注入过滤器?_Java_Spring_Spring Mvc_Filter - Fatal编程技术网

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

Java 如何将属性值注入过滤器?,java,spring,spring-mvc,filter,Java,Spring,Spring Mvc,Filter,我的问题很简单。我正在尝试向筛选器中注入属性值。在我的控制器类中,我使用了以下代码,可以成功地注入属性: @Controller public class StatementController { @Value("${xapi.version}") private String version; ... } 但是当我在自定义过滤器中使用相同的代码时,我在version属性中得到一个空值。代码如下: public class HeaderFilter extends OnceP

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

@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>

标题
com.application.HeaderFilter
标题
/*

Spring@Value-injection适用于由Spring容器(比如您的控制器)管理的bean

这里,过滤器不是由spring容器管理的,而是由JavaEE容器管理的

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

WebApplicationContextILS.getRequiredWebApplicationContext(filterConfig.getServletContext()).getEnvironment().getProperty(“xapi.version”);

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

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

因此,您必须拥有一个类为
HeaderFilter
的bean,并为其指定名称(比如
header
),然后将web.xml文件中的过滤器声明更改为:

@组成部分


标题
org.springframework.web.filter.DelegatingFilterProxy
标题
/*
<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>