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!