2016-09-14 35 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

相關問題