web-dev-qa-db-fra.com

Spring Boot: "Aucun haricot qualifiant de type ... trouvé" lors du câblage automatique d'une classe de béton

J'écris un composant avec Spring Boot et Spring Boot JPA. J'ai une configuration comme celle-ci:

L'interface:

public interface Something {
    // method definitions
}

La mise en oeuvre:

@Component
public class SomethingImpl implements Something {
    // implementation
}

Maintenant, j'ai un test JUnit qui fonctionne avec SpringJUnit4ClassRunner et je veux tester ma SomethingImpl avec ceci.

Quand je fais

@Autowired
private Something _something;

ça marche, mais

@Autowired
private SomethingImpl _something;

provoque l'échec du test lors du lancement d'une NoSuchBeanDefinitionException avec le message No qualifying bean of type [com.example.SomethingImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Mais dans le cas de test, je veux explicitement injecter ma SomethingImpl car c'est la classe que je veux tester. Comment y parvenir?

5
rabejens

Si vous voulez un bean spécial, vous devez utiliser l'annotation @Qualifier:

@Autowired
@Qualifier("SomethingImpl")
private Something _something;
5
Jens

J'ai pensé que vous pouvez faire la même chose avec un DI de style javax.inject:

@Named("myConcreteThing")
public class SomethingImpl implements Something { ... }

Où vous voulez l'injecter:

@Inject
@Named("myConcreteThing")
private Something _something;

Ceci est correctement pris en charge par @EnableAutoConfiguration et @ComponentScan.

4
rabejens

Je pense que vous devez ajouter @Service dans la mise en œuvre de la classe .. comme

@Service public class SomethingImpl implements Something { // implementation }

2
Ravi Macha