2017-09-22 2 views
1

J'essaie de lier automatiquement la liste des interfaces ainsi:liste Autowiring des composants au printemps 4

@Autowired 
private List<SomeInterface<SomeAbstractClass>> list; 

Ceci est mon interface et classe abstraite:

public interface SomeInterface<T extends SomeAbstractClass> 

public abstract class SomeAbstractClass implements Serializable 

Ce sont mes composants (ils devrait se retrouver dans la liste):

@Component("componentA") 
public class ImplementationA implements SomeAbstractClass<ClassAImpementingSomeAbstractClass> 

@Component("componentB") 
public class ImplementationB implements SomeAbstractClass<ClassBImpementingSomeAbstractClass> 

Et la mise en œuvre de la classe abstraite sont DÉFINIES comme ceci:

public class ClassAImpementingSomeAbstractClass extends SomeAbstractClass 
public class ClassBImpementingSomeAbstractClass extends SomeAbstractClass 

Le problème est survenu après la migration du ressort de 3.2.5 à 4.3.11. Au printemps 3, je reçois la liste qui ont ImplementationA et ImplementationB. Après avoir déménagé à ressort 4 Je reçois exception au cours du déploiement:

org.springframework.beans.factory.NoSuchBeanDefinitionException: Aucun haricot de qualification de type 'java.util.List < UneInterface < SomeAbstractClass >>' disponible: attendu au moins 1 haricot qui se qualifie comme candidat autowire. Dépendance annotations: {@ org.springframework.beans.factory.annotation.Autowired (requis = true)}

La question est pourquoi le printemps essaie de trouver le haricot de la liste de typ? Ne devrait-il pas essayer de trouver tous les haricots de type SomeInterface et les ajouter à la liste (exactement ce que j'ai au printemps 3)?

Merci pour vos suggestions!

Répondre

0

printemps a changé beaucoup de choses avec les génériques et les définitions de haricots dans la version 4.0 pour permettre des génériques d'être qualifiés pour les haricots etc.

https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics

Alors que je ne suis pas 100% sûr pourquoi cela ne fonctionne plus, je supposons qu'il vous faut maintenant être un peu plus précis pour que Spring puisse correctement évaluer ces qualificatifs. (Ou quelque chose comme ça)

Quoi qu'il en soit, vous devriez être en mesure de le réparer en faisant ceci:

@Autowired 
private List<SomeInterface<? extends SomeAbstractClass>> list;