J'ai deux contrôleurs ( ControllerA et ControllerB[)
Les deux contrôleurs appellent un service ( MyService ).
MyService appelle une interface appelée MyRepository qui a deux implémentations ( FirstRepository et SecondRepository ) .
Comment utiliser FirstRepository lorsque le service ( MyService ) est appelé depuis ControllerA et utilise SecondRepository lorsque l'appel provient de ControllerB ?
De cette façon, je peux réutiliser MyService et le référentiel utilisé provient de Spring Configuration.
3 Réponses :
Je peux voir deux solutions possibles ici.
1. Dans votre classe MyService, les deux implémentations sont câblées automatiquement avec l'annotation @Qualifier
(vous pouvez également autowire List.
Ensuite, la méthode MyService aurait un paramètre indiquant quelle implémentation MyRepository doit être appelée. Je ne recommanderais pas cette solution.
2. Définissez deux implémentations de MyService (FirstService, SecondService). Ensuite, FirstService achèverait automatiquement FirstRepository et SecondService relèverait automatiquement SecondRepository (utilisez à nouveau @Qualifier annotation
. Vous pouvez maintenant facilement injecter FirstService à ControllerA et SecondService à ControllerB.
Mais je penserais d'abord à l'architecture. Peut-être n'avez-vous pas besoin de contrôleurs séparés?
Merci @standy, tu m'as donné l'idée!
Avez-vous vérifié @Primary ou @Resource ou @ Qualifier annotations? En fonction de vos besoins, vous pouvez choisir parmi eux.
Quelque chose de similaire a été discuté ici .
Vérifié ces annotations mais ne s'appliquent pas à mon cas d'utilisation: - /
Je suis confus avec la réponse, vous essayez de mapper deux contrôleurs sur la même URL d'API?
À l'intérieur de chaque contrôleur, il y a une méthode avec un / chemin
distinct mais qui n'a pas été incluse pour garder l'exemple court. Peut-être que je devrais l'ajouter ...
J'ai fini par créer deux contrôleurs et définir deux classes @Configuration
, une pour chaque @Controller
.
Et en utilisant le code @Qualifier > les annotations définissaient deux ensembles de beans, puis, dans chaque contrôleur, indiquaient à Spring quel bean
@Qualified
je veux injecter.
@RestController @RequestMapping("/v1/inapp/purchases") class GPlayRedeemPurchaseController( @Qualifier("gplay") private val redeemPurchaseService: RedeemPurchaseService ) : RedeemPurchaseApiDocumentation { // More code }
Et l'autre contrôleur
@RestController @RequestMapping("/v1/inapp/purchases") class AController( @Qualifier("appStore") private val redeemPurchaseService: RedeemPurchaseService ) : RedeemPurchaseApiDocumentation { // More code }
Et deux fichiers @Configuration
, un par contrôleur.
Sur le plan de la conception, vous avez deux services, pas un. Avoir une classe de base (éventuellement abstraite) MyService et deux sous-classes MyService1 et MyService2 qui autowire respectivement FirstRepository et SecondRepository. Et ces services sont automatiquement câblés dans ControllerA et B respectivement.