[英]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.