2016-05-27 53 views
0

我的問題很簡單。我試圖將一個屬性值注入過濾器。在我的控制器類,我用下面的代碼,我可以成功地注入屬性:如何將屬性值注入過濾器?

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

回答

1

必須使用DelegatingFilterProxy,讓您的過濾器由Spring管理。它是一個特殊的代理,它執行所有查找根應用程序上下文的低級任務,獲取bean並將所有請求轉發給它。從javadoc中提取:

web.xml通常包含一個DelegatingFilterProxy定義,其中指定的filter-name對應於Spring的根應用程序上下文中的一個bean名稱。所有對過濾器代理的調用都將在Spring上下文中委託給該bean,這是實現標準Servlet過濾器接口所必需的。

所以你必須有HeaderFilter類的豆你給它一個名字(比如header),你在你的web.xml文件中更改過濾聲明:

@Component

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

春@Value注射適用於豆託管彈簧容器(如你的控制器)。

在這裏,您的過濾器不是由Spring容器管理的,而是由您的Java EE容器管理的。

可以恢復在init()方法的屬性:

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