Je possède une classe avec 2 classes imbriquées statiques qui effectuent la même opération sur 2 types génériques différents.
J'ai exposé les 2 classes en tant que beans et ajouté @Autowired pour les constructeurs comme je le fais habituellement.
Voici la configuration de base
classe abstraite Parent implémente MyInterface {
private final Service service;
Parent(Service service){ this.service = service; }
@Override public final void doInterfaceThing(T thing){
T correctedT = map(thing);
service.doTheThing(correctedT);
}
protected abstract T map(T t);
@Service
public static class ImplA extends Parent {
@Autowired ImplA (Service service){ super(service); }
A map(A a){ //map a }
}
@Service
public static class ImplB extends Parent {
@Autowired ImplB (Service service){ super(service); }
B map(B b){ //map b }
}
}
**
Et dans une autre classe j'ai
@Service
public class Doer {
private final List> aImpls;
@Autowired public Doer(List> aImpls){ this.aImpls = aImpls; }
public void doImportantThingWithA(A a){
aImpls.get(0).doInterfaceThing(a);
}
}
Lorsque j'exécute l'application, tout semble être injecté correctement et lorsque je mets un point d'arrêt dans les constructeurs ImplA et ImplB, j'ai une valeur non nulle pour "service". J'ai également un bean ImplA dans la liste aImpls de Doer.
Cependant, lorsque j'appelle doImportantThingWithA(a), "service" est nul à l'intérieur de ImplA et je me retrouve évidemment bloqué.
Je ne suis pas sûr que cela soit possible car :
- Je vois une valeur non nulle dans mes constructeurs pour service qui est un champ final.
- Si Spring injecte ImplA et ImplB dans une autre classe, il devrait déjà avoir injecté un Service dans ImplA ou ImplB, ou jeté une exception lors de l'initialisation du bean. Je n'ai rien paramétré pour charger de manière paresseuse et toutes les dépendances de bean sont requises.
La raison des classes imbriquées est que la seule chose qui change entre les 2 implémentations est la fonction map(). J'essaie d'éviter des classes supplémentaires pour une ligne de code variable.
Plus d'informations : Lorsque j'ajoute un point d'arrêt dans Parent.doInterfaceThing(), si j'ajoute une montre sur "service", j'obtiens null comme valeur. Si j'ajoute une méthode getService() et j'appelle ensuite getService() au lieu de faire référence directement à this.service, j'obtiens le bean correct pour service. Je ne connais pas les implications de cela mais quelque chose semble étrange avec le proxying.
**