2015-10-26 1 views
3

I ont le haricot ci-après défini comme étant une partie A.jarNoUniqueBeanDefinitionException: Non bean de qualification de type: Ce ne sont pas retournés

package abc; 

@Component 
public class ParentInterceptor implements ClientInterceptor { 

} 

j'ai créé un autre haricot dans un autre projet sous un autre paquet par l'extension ParentInerceptor

package xyz; 

@Component 
public class ChildInterceptor extends ParentInterceptor { 

} 

Dans mon application SpringBoot, j'ai un haricot défini ci-dessous semblable à

@ComponentScan({"abc","xyz"}) 
public class Application { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
} 

@Bean 
public Data dataRepo(ParentInterceptor p){ 

} 


} 

Lorsque j'exécute la méthode principale, je m'attends à voir NoUniqueBeanDefinitionException car 2 beans sont du même type. Cependant, je vois à la fois les beans sont chargés et ParentInterceptor est utilisé. Y at-il une raison pour laquelle l'erreur n'est pas lancée?

EDIT

Cependant, quand je l'ai fait au-dessous, j'ai pu voir l'erreur d'être jeté. Cependant, je suis toujours incapable de comprendre pourquoi une erreur n'a pas été lancée dans le cas mentionné ci-dessus.

package xyz; 

@Component 
public class ChildInterceptor1 extends ChildInterceptor { 

} 

classe Application:

@ComponentScan({"abc","xyz"}) 
    public class Application { 

     public static void main(String[] args) { 
      ApplicationContext ctx = SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public Data dataRepo(ChildInterceptor p){ 

    } 


    } 

EDIT 2

J'ai essayé aussi de vérifier si le grain de l'enfant qui s'étend en effet le parent à l'aide du code ci-dessous -

ctx.getBeansOfType(ParentInterceptor.class) 

Ce rendement ParentInterceptor & ChildInceptceptor. Donc, je ne suis pas vraiment sûr pourquoi Spring ne retourne pas l'erreur!

+0

Je suis d'accord que le premier cas devrait échouer. Pouvez-vous partager un exemple complet qui reproduit le problème? –

+0

Merci Andy. Cela fait partie d'un grand projet, mais je suis incapable de créer une application autonome pour répliquer ce problème. Cependant j'essaie toujours de faire ça. –

+0

Y a-t-il un paramètre qui contournerait cette erreur et injecterait la classe appropriée? Dans mon cas, je suis en mesure de voir le ParentInterceptor étant injecté. Cependant, lorsque je définis l'annotation @Primary sur ClientInterceptor, ClientInterceptor est injecté. Existe-t-il une configuration avec l'annotation SpringBootApplication (convention sur la configuration), qui permet à Spring de choisir les beans appropriés sans générer d'erreur? Désolé, je suis toujours incapable de trouver un exemple où je peux reproduire cela. Je reçois toujours NoUniqueBeanDefinitionException et semble manquer une certaine config. –

Répondre

0

Dans votre premier exemple (Parent et enfant), j'ai le comportement correct, qui est la levée NoUniqueBeanDefinitionException.

Si vous voulez spécifier les haricots à injecter, vous pouvez utiliser l'annotation @Qualifier:

@Bean 
public Data dataRepo(@Qualifier("parentInterceptor") ParentInterceptor p) { 

} 

En option, vous pouvez donner un nom à un composant:

@Component("foo") 

et le changement le @Qualifier en conséquence.