2016-03-14 22 views
5

Sto cercando di iniettare un bean generico specifico per il sottotipo Generico, ma Spring non è in grado di risolvere la dipendenza. Rimuovendo il tipo dal bean, tutto funziona come previsto. Ecco un esempio:Iniezione di dipendenza del sottotipo generico con 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 
    } 
} 

Qui è una classe di destinazione:

@Service 
    public BaseService{ 

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

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

dipende profilo attivo viene inizializzato solo CompanyBean o EmployeeBean, mai entrambi. Ho anche provato a impostare lo stesso nome con i bean e noi con l'annotazione @Qualifier.

Esiste un modo per iniettare questo bean usando la sintassi del diamante? Spring è in grado di risolvere una determinata dipendenza? Utilizzando Spring 4.2.x.


Edit: Con Primavera 4.3 viene dovrebbe essere possibile. Vedere Juergen Hoeller's talk

+0

Hai provato a riprodurre automaticamente 'abstractBean pubblico baseBean; '? – SimY4

risposta

0

So che non sono probabilmente andando come questo, ma perché non separare l'EmployeeForm e la CompanyForm a 2 moduli di base separati, e poi nei BaseService fare DUE interi, per l'Autowire.

Questa non è una risposta di primavera in sé, ma è quello che vorrei fare, come un rapido lavoro in giro per vedere se avrebbe funzionato. Separarli non è un terribile compromesso di design.

+0

Avrebbe risolto il problema, ma nel mio caso non è una soluzione perché dovrei duplicare un bel po 'di codice. In termini di manutenibilità è la soluzione peggiore. Grazie comunque. –