繁体   English   中英

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

[英]How to inject a property value into a filter?

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

@Controller
public class StatementController {
    @Value("${xapi.version}")
    private String 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>

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

在这里,过滤器不是由spring容器管理的,而是由Java EE容器管理的。

您可以使用init方法恢复属性:

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

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

web.xml通常将包含DelegatingFilterProxy定义,其指定的过滤器名称与Spring的根应用程序上下文中的bean名称相对应。 然后,所有对过滤器代理的调用将在Spring上下文中委派给该bean,这是实现标准Servlet Filter接口所必需的。

因此,您必须具有一个HeaderFilter类的Bean, HeaderFilter为其指定名称(例如header ),然后将web.xml文件中的filter声明更改为:

@零件

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM