Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringBootWebApplication中配置2个独立的过滤器?_Java_Spring_Spring Mvc_Filter_Spring Boot - Fatal编程技术网

Java 如何在SpringBootWebApplication中配置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

我试图在spring引导配置中使用FilterRegistrationBean添加两个单独的过滤器

下面是我对2个过滤器的实现

@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”,但没用。谢谢你的帮助