2016-09-14 54 views
0

我试图在Spring引导配置中使用FilterRegistrationBean添加2个单独的过滤器。如何在spring boot webapplication中配置2个独立的过滤器?

这是我的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) 
+0

看起来Spring在创建FeatureAccessFilter实例时失败了。请张贴相同的代码。正如@guchuan所建议的那样,使用限定符来定义并注入相同类型的bean –

回答

1

Bean是按类型搜索的,对于这两个Bean类型都是相同的,所以这就是问题所在。

要解决这个问题,您可以添加@Qualifier来解决通过bean名称的自动装配。

或者您可以将@Primary添加到其中一个Bean,如果其中一个应该默认使用。

例如,

@Bean 
@Primary 
FilterRegistrationBean someFilterRegistration() { 
    ... 
} 
@Bean 
FilterRegistrationBean shareFilterRegistration() { 
... 
} 

这一点,如果你做

@Autowired 
FilterRegistrationBean bean; 

你someFilterRegistration()自动连接,并通过这样做

@Autowired 
@Qualifier("shareFilterRegistration") 
FilterRegistrationBean bean; 

你会得到其他一。

+0

并添加“@Primary”为我工作。我之前尝试过使用“@Qualifier”,但没有工作。 感谢您的帮助 – bagui

相关问题