从OncePerRequestFilter访问spring bean

时间:2016-10-20 02:35:50

标签: spring spring-mvc filter

我想从OncePerRequestFilter类访问一个spring组件,但是当我访问服务时我得到空指针,我认为原因就是配置。 我认为由于配置原因,在Spring调度程序servlet之前调用了过滤器。完成任务的好方法,请提出建议。

def copy_metadata(path)
  st = lstat()
  if !st.symlink?
    File.utime st.atime, st.mtime, path
  end
  begin
    if st.symlink?
      begin
        File.lchown st.uid, st.gid, path
      rescue NotImplementedError
      end
    else
      File.chown st.uid, st.gid, path
    end
  rescue Errno::EPERM
    # clear setuid/setgid
    ... omitted ...
  end
end

并且记录器为“authCheckService”打印null

3 个答案:

答案 0 :(得分:2)

在你的init()OncePerRequestFilter中添加它,所以spring可以连接自动装配的bean

public void init(FilterConfig filterConfig) throws ServletException {
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
            filterConfig.getServletContext());
}

答案 1 :(得分:2)

您正在Spring容器外部配置过滤器。因此,不会注入@Autowired依赖项。

要让Spring管理您的Filter bean而不通过使用建议的SpringBeanAutowiringSupport将它与Spring基础结构紧密耦合,您可以使用DelegatingFilterProxy抽象

将AuthCheckFilter过滤器定义为应用程序上下文中的bean,例如

@Bean
public Filter authCheckFilter(){
     AuthCheckFilter filter = new AuthCheckFilter();
     //supply dependencies
     return filter;
}

然后在你的web.xml中用filter-class指定你的过滤器为org.springframework.web.filter.DelegatingFilterProxy,过滤器名称必须与上下文中的authCheckFilter bean名称相匹配

在运行时,DelegatingFilterProxy过滤器将委托给一个完全配置的bean,在上下文中使用名称为authCheckFilter(必须是过滤器)

<filter>
  <filter-name>authFilterCheck</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>    
<filter-mapping>
  <filter-name>authCheckFilter</filter-name>
  <url-pattern>/test/api/*</url-pattern>
</filter-mapping>

使用此设置,您不必担心过滤器,根上下文或servlet的生命周期

答案 2 :(得分:1)

我不知道为什么@Autowire不起作用,但我通过使用setter注入工作。

详情:

将其包含在applicationContext.xml文件中

    <bean name="AuthCheckFilter" class="x.y.AuthCheckFilter">
       <property name="authCheckService" ref="authCheckService"/>
    </bean>

    <bean name="authCheckService" class="x.y.AuthCheckService"/>

请记住在AuthCheck服务的AuthCheckFilter类中提供一个setter。

将此内容包含在您的web.xml中:

 <filter>
    <filter-name>AuthCheckFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthCheckFilter</filter-name>
    <url-pattern>/test/api/*</url-pattern>
</filter-mapping>

就是这样。现在,如果你点击了网址,你将获得非null的authCheckService。