Question

Je souhaite utiliser @AutoWired pour injecter un bean non géré configuré avec @Component dans un bean géré. Je suis presque sûr d'avoir la configuration correcte, mais pour une raison quelconque, je continue à recevoir l'exception:

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean

Sur la base de l'erreur, je suppose qu'il est impossible de trouver la classe Baz, mais je ne sais pas pourquoi. D'après ce que j'ai compris, le contexte: l'élément configuré dans la configuration XML du type spring était censé me permettre de le faire. J'ai également veillé à inclure les fichiers jar appropriés (spring-weaving.jar et aspectjweaver.jar).

Voici un exemple simple de ma configuration.

Ma configuration XML:

<beans ...>
    ...

    <context:annotation-config/>
    <context:spring-configured/>
    <context:component-scan base-package="foo"/>

    <bean id="bar" class="foo.Bar"/>
    ...
</beans>

J'ai un haricot géré:

package foo;

public class Bar {

    @Autowired
    private Baz baz;

    public void setBaz(Baz baz) {
        this.baz = baz;
    }

    ...
}

Et un haricot non géré:

package foo;

@Component
public class Baz {
    ...
}

Y a-t-il quelque chose qui me manque?

EDIT : le journal répertorie les beans qu'il instancie et foo.Baz n'en fait pas partie. Je ne sais pas pourquoi il ne prend pas la classe annotée @Component.

Était-ce utile?

La solution

Etant donné que Bar est configuré avec xml, il ne peut être configuré qu’avec xml. c'est-à-dire que vous ne pouvez pas les mélanger. Pour que " @ Autowired " l'annotation sur Baz n'est pas prise en compte (aucune des annotations ne le serait). Ce n'est que lorsque vous ajoutez l'annotation Spring au niveau de la classe que celui-ci écoute toutes les autres annotations.

Dans le XML, vous devez configurer le bean de sorte qu'il soit automatiquement câblé par type, ajouter un séparateur pour ce type et obtenir le comportement souhaité.

<bean id="bar" class="foo.Bar" autowire="byType"/>

Une dernière chose, lorsque vous annotez un haricot avec @Component, il est un haricot géré par un ressort. Le fait qu’il n’ait pas été créé avec XML ne veut pas dire qu’il n’est pas géré. Un haricot non géré est celui que vous n'obtenez pas du printemps.

Bar et Baz sont tous deux gérés au printemps. C’est le mécanisme que vous avez choisi pour les définir qui diffère.

Autres conseils

La réponse précédente n’est pas correcte, sous un aspect. Vous pouvez connecter automatiquement des beans configurés avec XML.

De la section 3.4.5 de http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html :

Lorsque vous utilisez des métadonnées de configuration basées sur XML [2], vous spécifiez le mode autowire pour une définition de bean avec l'attribut autowire de l'élément. La fonctionnalité de câblage automatique a cinq modes. Vous spécifiez le câblage automatique par bean et vous pouvez donc choisir ceux à transférer automatiquement.

Vous pouvez connecter automatiquement par nom, type et constructeur. Voici un exemple brut de ceci: http://www.java2s.com/ Code / Java / Spring / AutoWiring.htm

L'erreur est due à la séquence de beans définie dans votre fichier de configuration XML.

Comme dans votre fichier XML, le bean pour la code est créé en premier, puis les beans dépendants pour lesquels @Autowired n'est pas en mesure de trouver baz .

Vous devez d’abord déclarer le bean pour baz , puis pour bar .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top