2017-10-19 107 views
0

最近我被要求創建一個新的profile來(去)激活一個功能。我有兩種情況下我必須做出改變:@Profile和@ConditionalOnProperty

class A { 

    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     SecurityConfigurer ldapConfigurer = securityFactory.ldapAuthenticationProviderConfigurer(); 
     ldapConfigurer.configure(auth); 
     SecurityConfigurer offlineConfigurer = securityFactory.offlineAuthenticationProviderConfigurer(); 
     offlineConfigurer.configure(auth); 
    } 

} 

在上面的類,如果配置文件是活動的,最後兩行沒有被執行。我擴展了課程,並將其指定爲新配置文件@Profile("notOffline"),並將其放在原始課程@Profile("!notOffline")中。

class A { 

    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     SecurityConfigurer ldapConfigurer = securityFactory.ldapAuthenticationProviderConfigurer(); 
     ldapConfigurer.configure(auth); 
     SecurityConfigurer offlineConfigurer = securityFactory.offlineAuthenticationProviderConfigurer(); 
     offlineConfigurer.configure(auth); 
    } 

} 

    class B extends A { 
     @Override 
     public void configure(AuthenticationManagerBuilder auth) throws Exception { 
      super(); 
      SecurityConfigurer offlineConfigurer = securityFactory.offlineAuthenticationProviderConfigurer(); 
      offlineConfigurer.configure(auth); 
     } 

    } 

第二個地方,我不得不重構是這樣的:

class C { 

public Something foo() { 
    code(); 
    code(); 
    code(); 
    thisLineHasNotToBeExecuted(); 
    code(); 
    code(); 
    return something; 
    } 

} 

還沒有被執行的行取決於變量,該方法使用的休息,這不是什麼返回。我之前所做的方法並不是這種情況下的快樂方法(並且有兩種方法正在調用此方法,但尚未執行)。

經過一段時間,我意識到一個更好的方法是將屬性添加到最後一個類,該類註釋了@Value並將參數傳遞給啓動時的tomcat。這樣我可以在thisLineHasNotToBeExecuted()裏有一個if,我可以在class A及其孩子上使用@ConditionalOnProperty

我的方法是否正確?

更多信息:當我使用ActiveDirectory和第二個類時,我(de)激活了故障轉移認證,我正在阻止將用戶信息保存在緩存中。

謝謝!

回答

1

您在第一種情況下使用配置文件將是適當的。

「@ConditionalOnProperty」不是處理第二個用例的正確方法。它通常用於Spring Boot Starter項目的啓動配置。

您的想法是使用屬性並添加一個「if」來決定是否執行thisLineHasNotToBeExecuted();'在正確的軌道上。如果該行的執行取決於配置文件,則可以將活動配置文件注入到該類中並鍵入該值。如果您使用的是spring boot config服務器,那麼請確定並添加一個「@RefreshScope」。