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