Question

Arrière-plan: Donc, j'ai plusieurs grains de l'interface des systèmes externes.Pour le développement, il est commode de se moquer des systèmes externes et remplacer l'interfaçage des haricots avec des implémentations qui produisent plus ou moins statique réponses.Donc, ce que j'ai fait est de créer une interface, la mise en œuvre réelle et un talon de mise en œuvre comme ceci:

public interface ExternalService {
// ...
}

@Service
public class ExternalServiceImpl implements ExternalService {
// ...
}

@Service
@Primary
@Profile({"stub"})
public class StubExternalService implements ExternalService {
// ...
}

...et cela fonctionne très bien:si le talon de profil n'est pas présent, le demi-fève n'est pas chargé du tout.Si elle est présente, elle joliment remplace le réel de la mise en œuvre en raison de l' @Primaire d'annotation.

Problème: Maintenant, cependant, j'ai couru pour la première fois dans une situation où j'ai réellement deux implémentations d'une même interface.L'un d'eux est défini comme primaire, mais les autres peuvent aussi être utilisés en les chargeant à partir du contexte de l'application.

J'ai tout de même envie de créer un talon de service pour les remplacer à la fois, mais cette fois, mon ancienne façon de définir le talon comme @Primaire ne fonctionne pas, parce qu'il y a déjà une première mise en œuvre.En fait ce que j'avais besoin d'une manière de ne pas surcharger le principal bean lorsque le talon de profil est réglé, mais je suis à une perte sur exactement comment le faire.Des recherches sur le Web ou d'autres Débordement de Pile questions ne semblent pas être les aider.

Était-ce utile?

La solution

S'avère que la réponse est étonnamment simple:vous ajoutez un non-opérateur (!) devant le nom de profil:

@Service
@Primary
@Profile({"!stub"})
public class ExternalServiceImpl implements ExternalService {
// ...
}

De cette façon, le haricot est chargé uniquement lorsque l' stub-profil n'est pas active.Le support de cette fonctionnalité a été ajoutée dans Printemps 3.2 M1.

Il y a une mise en garde cependant:si vous écrivez @Profile({"!stub", "foo"}), la virgule est considérée comme "ou", pas de "et".Pour cet exemple bean serait activé soit si stub n'était pas active ou si foo a été active.

Modifier/Ajouter: Printemps 5.1 ajouté un support pour une nouvelle expression de la langue pour les profils: !stub & foo est activé lorsque stub n'est pas actif et foo est active.Grand succès!!!Vous pouvez même mélanger et assortir ands et rup à condition que vous utilisez des parenthèses: production & (us-east | eu-central).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top