我的问题很简单。我正在尝试将属性值注入过滤器。在我的控制器类中,我使用了以下代码,我可以成功注入属性:
@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>
@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,你给它一个名字(比如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>