2017-10-19 7 views
0

Récemment, il m'a été demandé de créer un nouveau profile pour (dé) activer une fonctionnalité. J'ai deux situations où je dois faire des changements:@Profile vs @ConditionalOnProperty

class A { 

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

} 

Dans la classe ci-dessus, si le profil est actif, les deux dernières lignes ne doivent pas être exécutées. J'ai prolongé la classe et lui assigner le nouveau profil @Profile("notOffline") et dans la classe originale j'ai mis @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); 
     } 

    } 

La deuxième place, je dois factoriser est quelque chose comme ceci:

class C { 

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

} 

La ligne qui n'a pas à exécuter dépend de variables que le reste de l'utilisation de la méthode, et ce n'est pas ce qui est retour. L'approche que j'ai faite auparavant n'est pas la bonne pour ce cas (et il y a deux méthodes qui invoquent cette méthode qui ne doit pas être exécutée). Après un certain temps, j'ai réalisé qu'une meilleure approche serait d'ajouter une propriété à la dernière classe qui est annotée avec @Value et passer l'argument à Tomcat au démarrage. De cette façon, je pourrais avoir un if à l'intérieur thisLineHasNotToBeExecuted() et je pourrais utiliser @ConditionalOnProperty sur class A et son enfant.

Mon approche est-elle correcte?

Encore plus d'informations: ce que je désactive une authentification de basculement lorsque nous utilisons ActiveDirectory et dans la deuxième classe j'empêche d'enregistrer les informations de l'utilisateur dans le cache.

Merci!

Répondre

1

Votre utilisation de profils dans le premier cas serait appropriée. '@ConditionalOnProperty' n'est pas la bonne façon de gérer votre deuxième cas d'utilisation. Il doit normalement être utilisé pour la configuration de démarrage avec les projets Spring Boot Starter.

Votre idée d'utiliser une propriété et d'ajouter un «si» pour décider d'exécuter «thisLineHasNotToBeExecuted(); est sur la bonne voie. Si l'exécution de cette ligne dépend du profil, vous pouvez alors injecter le profil actif dans la classe et supprimer cette valeur. Si vous utilisez le serveur de configuration spring boot, assurez-vous d'ajouter un "@RefreshScope".