2016-05-16 101 views
0

我正在製作一個需要基本認證或Oauth2的彈簧啓動應用程序,具體取決於我定義的屬性。動態加載配置Bean

問題是,如果我使用@configuration創建了兩個類,那麼應用程序不會啓動,如果我只留下一個並在configure方法中添加一個if來配置HttpSecurity對象,端點具有基本認證。

我嘗試這樣動態註冊豆:

@Bean 
public ResourceServerSecurityConfig oauthConfig(){ 
    if(isOauthEnabled){ 
     return new ResourceServerSecurityConfig(); 
    }else{ 
     return null; 
    } 
} 
@Bean 
public BasicSecurityConfig basicConfig(){ 
    if(isOauthEnabled){ 
     return new BasicSecurityConfig(); 
    }else{ 
     return null; 
    } 
} 

不過,這不加載的配置。 有關如何將其歸檔的任何提示?

回答

1

你需要的是條件bean的創建。嘗試使用@Conditional。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Conditional.html

您可以創建基於系統屬性自定義條件。

您也可以將若但是做它的可讀性和集羣將你的配置,但對於一個簡單的例子試試這個:

@Bean 
public SecurityConfig basicConfig(@Value("${authentication.type.oauth}" boolean isOauthEnabled)){ 
    if(isOauthEnabled){ 
     return new ResourceServerSecurityConfig(); 
    }else{ 
     return new BasicSecurityConfig(); 
    } 
} 

然而,這是一個骯髒的黑客。

+0

「@Conditional」工作!好...好。它根據一個值加載bean。我現在遇到的問題是我創建了一個實現了Condition接口的類,但該類沒有從屬性文件中加載「@Value」。我試圖用「@Component」註解類,因爲對於「@value」來說,類應該是一個bean,但是我找不到爲什麼這個值沒有被加載。無論如何,我標記你的答案是正確的,因爲這解決了原來的問題;)。謝謝! – aruiz

+1

找到最後一個問題的解決方案。使用Match方法中的ConditionContext,我能夠從文件中讀取屬性。因爲[鏈接](http://stackoverflow.com/questions/25276463/how-get-working-value-or-environment-in-a-class-implementing-the-condition-conf)說, 「春天需要你已經指定的Class類型並將其實例化爲使用其匹配方法,它不會將該實例視爲一個bean,它不會執行自動裝配,也不會執行任何@Value處理,後者對於BeanFactoryPostProcessor也是如此「。 – aruiz

0

您是否在Spring Boot Application中定義了註釋@SpringBootApplication

請參見下面的示例:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ....... 
     } 
    } 

} 

你也可以註釋@Import({ApplicationConfig.class})主應用程序。

+0

是的,我已將@SpringBootApplication註釋添加到主應用程序。 – aruiz

+0

你也可以註釋@導入({ApplicationConfig.class})到主應用程序,這意味着配置類的類名稱 – shankarsh15

+0

但我需要根據屬性值加載配置,@import可以有條件嗎? – aruiz