7
votes

L'annotation @qualifier au printemps ne fonctionne pas

Je viens d'apprendre le cadre de printemps et j'utilise le printemps 2.5 pour cet apprentissage. J'ai créé trois haricots avec ces classes

nourriture.java p> xxx pré>

nasigoreng.java p> xxx pré>

renduang.java p> xxx pré>

pecintakuliner.java p> xxx pré>

configuration XML, qualificatif-test.xml p> xxx

Enfin, la classe avec la méthode principale est QualifierestMain.java:

package com.spring.danipetrick;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class QualifierTestMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("/qualifier-test.xml"); 

        PencintaKuliner bondan = (PencintaKuliner)context.getBean("bondan");
        bondan.sayMaknyus();
    }
}


1 commentaires

J'ai eu un problème similaire injectant deux fois la dépendance dans un service par le constructeur (AllargSconstructeur de Lombok) et sur le terrain.


4 Réponses :


7
votes

Votre méthode et votre champ sont annotés avec @autowired code>. En tant que tel, le printemps tentera d'injecter les deux. Sur l'une des pistes, il essaiera d'injecter xxx pré>

qui fonctionnera car la cible d'injection est qualifiée. P>

la méthode cependant p> xxx PRE>

ne qualifie pas le paramètre d'injection, le ressort ne sait pas quel haricot à injecter. p>

Modifiez ce qui précède sur P>

@Autowired
public void setFood(@Qualifier("nasigoreng") Food food) {
    this.food = food;
}


2 commentaires

Je me débarrasse de @aotowired. Je pense que cela ne sait toujours pas quel haricot utiliser. L'erreur devient comme ceci: Exception dans le fil "Main" Java.Lang.NullPointereException à com.spring.danipetrick.pencintakinuer.saymaknyus (Pencintaku Liner.java:20) à com.spring.danipetrick.qualifiertestmain.main ( Qualifierestme ain.java:11)


@Dani n'a pas vu la méthode annotée. J'ai édité ma réponse pour clarifier.



3
votes

Essayez uniquement de supprimer @autowired code> à partir de setFood () code> dans pecintakuliner code>

comme p>

@Autowired
@Qualifier("nasigoreng")
private Food food;

public void setFood(Food food) {
    this.food = food;
}


3 commentaires

Hey ça marche. Pouvez-vous me dire comment ça marche? Merci sandhu :)


Vous ne pouvez pas utiliser d'annotations sur les deux niveaux et les champs en même temps. Utilisez-le avec des champs ou avec un réglage.


@Sandhu techniquement vous pouvez. C'est juste redondant.



4
votes

J'ai essayé avec le printemps 4.2.4. Problème résolu juste en ajoutant dans le fichier de configuration.


0 commentaires

1
votes

Essayez de vous retirer du constructeur de la classe Nasigoreng. Cela a fonctionné pour moi.


1 commentaires

Oui ça a fonctionné !!! Mais je n'ai pas compris pourquoi le constructeur causerait un problème?