2016-03-14 13 views
5

Ich versuche, spezifische generische Bean in den generischen Subtyp zu injizieren, aber Spring kann die Abhängigkeit nicht auflösen. Durch das Entfernen des Typs von der Bean funktioniert alles wie erwartet. Hier ein Beispiel:Abhängigkeitsinjektion des Generischen Subtyps mit Spring

public class AbstractFrom{ 
    // ... 
} 

public class EmployyForm extends AbstractFrom{ 
    // ... 
} 

public class CompanyForm extends AbstractFrom{ 
    // ... 
} 

abstract class AbstractBean<T extends AbstractFrom>{ 

    public abstract void calculate(T form); 
} 

@Component 
public CompanyBean extends AbstractBean<CompanyForm>{ 

    public void calculate(CompanyForm form){ 
     // specific impl 
    } 
} 

@Component 
public EmployeeBean extends AbstractBean<EmployyForm>{ 

    public void calculate(EmployyForm form){ 
     // specific impl 
    } 
} 

Hier wird eine Zielklasse:

@Service 
    public BaseService{ 

     @Autowire 
     public AbstractBean<AbstractFrom> baseBean; // <- NoSuchBeanDefinitionException 

     // @Autowire 
     // public AbstractBean baseBean; <- Injection works as is expected 
    } 

Hängt von aktivem Profil initialisiert wird nur CompanyBean oder EmployeeBean, nie beide. Ich habe auch versucht, den gleichen Namen gegeben Bohnen und uns @Qualifier Annotation.

Gibt es eine Möglichkeit, wie diese Bohne mit Diamantsyntax injizieren? Kann Spring gegebene Abhängigkeit auflösen? Mit Frühling 4.2.x.


Edit: With Spring 4.3 ist, sollte möglich sein. Siehe Juergen Hoeller's talk

+0

Haben Sie versucht, public AbstractBean baseBean; '? – SimY4

Antwort

0

Ich weiß, Sie sind wahrscheinlich nicht das mögen werden, aber warum nicht trennt die EmployeeForm und die CompanyForm zu 2 separaten Grundformen, und dann in dem BaseService macht ZWEI entires, für die Autowire.

Dies ist keine Frühjahr Antwort per se, aber das ist was ich tun würde, als eine schnelle Arbeit um zu sehen, ob es funktionieren würde. Trennung von ihnen ist kein schrecklicher Design-Kompromiss.

+0

Es würde das Problem lösen, aber das ist keine Lösung in meinem Fall, weil ich ziemlich viel Code kopieren müsste. In Bezug auf Wartungsfreundlichkeit ist es eine schlechtere Lösung. Danke trotzdem. –

Verwandte Themen