2017-10-19 67 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”。