Java 如何在SpringBootWebApplication中配置2个独立的过滤器?
我试图在spring引导配置中使用FilterRegistrationBean添加两个单独的过滤器 下面是我对2个过滤器的实现Java 如何在SpringBootWebApplication中配置2个独立的过滤器?,java,spring,spring-mvc,filter,spring-boot,Java,Spring,Spring Mvc,Filter,Spring Boot,我试图在spring引导配置中使用FilterRegistrationBean添加两个单独的过滤器 下面是我对2个过滤器的实现 @Bean public FilterRegistrationBean someFilterRegistration() { FilterResgistrationAccess registration = new FilterResgistrationAccess(); registration.setFilter(new FeatureAccess
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterResgistrationAccess registration = new FilterResgistrationAccess();
registration.setFilter(new FeatureAccessFilter());
registration.addUrlPatterns("/api/*");
registration.setName("featureAccessFilter");
registration.addInitParameter("paramName", "paramValue");
registration.setOrder(1);
return registration;
}
@Bean
public FilterRegistrationBean shareFilterRegistration() {
FilterResgistrationShare registration = new FilterResgistrationShare();
registration.setFilter(new ShareAccessFilter());
registration.addUrlPatterns("/content_external/*");
registration.setName("shareAccessFilter");
registration.setOrder(2);
return registration;
}
但它给出了以下错误,无法启动应用程序上下文。
请让我知道如何才能实现同样的目标
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'featureAccessFilter':
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field:
private org.springframework.boot.context.embedded.FilterRegistrationBean com.beroe.insync2.config.FeatureAccessFilter.filterRegistrationBean;
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [org.springframework.boot.context.embedded.FilterRegistrationBean] is defined:
expected single matching bean but found 2: someFilterRegistration,shareFilterRegistration
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
原因:org.springframework.beans.factory.BeanCreationException:
创建名为“featureAccessFilter”的bean时出错:
自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:
无法自动关联字段:
private org.springframework.boot.context.embedded.FilterRegistrationBean com.beroe.insync2.config.FeatureAccessFilter.FilterRegistrationBean;
嵌套异常为org.springframework.beans.factory.NonuiqueBeandDefinitionException:
未定义[org.springframework.boot.context.embedded.FilterRegistrationBean]类型的合格bean:
应为单个匹配bean,但找到2:someFilterRegistration、shareFilterRegistration
位于org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor.postProcessPropertyValues(AutoWiredNotationBeanPostProcessor.java:334)
Bean是按类型搜索的,对于这两个Bean,类型是相同的,所以这就是问题所在 要解决这个问题,您可以添加@Qualifier以按bean名称解决autowire 或者,如果默认情况下应该使用其中一个Bean,则可以将@Primary添加到其中一个Bean中 比如说,
@Bean
@Primary
FilterRegistrationBean someFilterRegistration() {
...
}
@Bean
FilterRegistrationBean shareFilterRegistration() {
...
}
如果你这样做的话
@Autowired
FilterRegistrationBean bean;
通过执行以下操作,可以自动连接到某些FilterRegistration()
@Autowired
@Qualifier("shareFilterRegistration")
FilterRegistrationBean bean;
您将得到另一个。在创建FeatureAccessFilter实例时,spring似乎失败了。请张贴相同的代码。正如@guchuan所建议的,使用限定符来定义和注入类型相同的bean,添加“@Primary”对我来说很有用。我以前试过“@Qualifier”,但没用。谢谢你的帮助