【问题标题】:How to inject a property value into a filter?如何将属性值注入过滤器?
【发布时间】:2016-09-25 07:16:00
【问题描述】:

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

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

【问题讨论】:

    标签: java spring spring-mvc filter


    【解决方案1】:

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

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

    您可以在 init 方法中恢复您的财产:

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

    【讨论】:

      【解决方案2】:

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

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

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

      @组件

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多