为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Spring Boot 过滤器注册 Bean 将依赖项注入 Servlet 过滤器?

如何使用 Spring Boot 过滤器注册 Bean 将依赖项注入 Servlet 过滤器?

侃侃无极 2023-06-08 19:54:24
我正在注册的 Spring Boot (2.0.1) 应用程序中有一个 Servlet 过滤器FilterRegistrationBean,我需要它在过滤器链中首先执行(一个顺序)。应用程序部署到JBoss 7.2。这个过滤器也有一个注入的依赖项@Autowired(见下文):package my.pkg.com@SpringBootApplication@ComponentScan(basePackages={"my.pkg.com"})public class MyApp extends SpringBootServletInitializer {  public satic void main(String[] args) throws IOException {    SpringApplication.run(MyApp.class, args);  }  @Bean  @Order(1)  public FilterRegistrationBean<MyFilter> myFilter() {    FilterRegistrationBean<MyFilter> contextFilter = new FilterRegistrationBean<>();    contextFilter.setFilter(new MyFilter());    contextFilter.addUrlPattern("/api/*");    return contextFilter;  }}package my.pkg.com.filterpublic class MyFilter extends Filter {  @Autowired  private MyService mySrv;  @Override  public void doFilter(…) {    mySrv.doSomething(); // mySrv is null  }}问题是当应用程序部署和运行时,当 Servlet 请求到达时MyFilter.doFilter(),mySrv为 null,这意味着MyFilter从未扫描过依赖注入。我可以通过调试验证MyService哪个@Repositoryinmy.package.com.repository包确实被初始化了。它永远不会被注入到MyFilter.MyFilter我可以为take创建一个构造函数MyService,然后@Autowired MyService在MyApp过滤器注册期间,我可以将它传递给这个构造函数,这样就解决了这个问题。MyFilter但是,我想知道是否有什么我做错了,因为单独使用上面的设置没有注入这种依赖性。
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

如果你自己创建一个对象,使用new,并且这个对象不是由@Bean-annotated 方法返回的,那么它就不是 Spring bean,因此 Spring 不会向其中注入任何东西。


您可以只添加一个带@Bean 注释的方法返回new MyFilter(),然后调用该方法myFilter()以获取 bean,或者将一个MyFilteras 参数添加到myFilter().


例子:


@Bean

@Order(1)

public FilterRegistrationBean<MyFilter> myFilter() {

    FilterRegistrationBean<MyFilter> contextFilter = new FilterRegistrationBean<>();

    contextFilter.setFilter(theActualFilter());

    contextFilter.addUrlPattern("/api/*");

    return contextFilter;

}


@Bean 

public MyFilter theActualFilter() {

    return new MyFilter(); // now this is a Spring bean

}

或者


@Bean

@Order(1)

public FilterRegistrationBean<MyFilter> myFilter(MyFilter theActualFilter) {

    FilterRegistrationBean<MyFilter> contextFilter = new FilterRegistrationBean<>();

    contextFilter.setFilter(theActualFilter);

    contextFilter.addUrlPattern("/api/*");

    return contextFilter;

}


@Bean 

public MyFilter theActualFilter() {

    return new MyFilter(); // now this is a Spring bean

}


查看完整回答
反对 回复 2023-06-08
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

很简单,@Component在你的过滤器类上添加注解,它会让@Autowired注解在内部工作,因为 Spring 依赖注入将处理你的过滤器类并注入服务 bean。



查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信