it-swarm.com.ru

Spring Boot: "Не найден квалифицируемый компонент типа…" при автопроводке для конкретного класса

Я пишу компонент, используя Spring Boot и Spring Boot JPA. У меня есть такая настройка:

Интерфейс:

public interface Something {
    // method definitions
}

Реализация:

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

Теперь у меня есть тест JUnit, который выполняется с SpringJUnit4ClassRunner, и я хочу проверить мой SomethingImpl с этим.

Когда я делаю

@Autowired
private Something _something;

это работает, но

@Autowired
private SomethingImpl _something;

приводит к сбою теста, бросая NoSuchBeanDefinitionException с сообщением 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)}

Но в тестовом примере я хочу явно внедрить мой SomethingImpl, потому что это класс, который я хочу протестировать. Как мне этого добиться?

5
rabejens

Если вам нужен специальный компонент, вы должны использовать аннотацию @Qualifier:

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

Я понял, что вы можете сделать то же самое с DI в стиле javax.inject:

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

Где вы хотите ввести его:

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

Это правильно подобрано @EnableAutoConfiguration и @ComponentScan.

4
rabejens

Я думаю, что вам нужно добавить @Service в реализации класса .. как 

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

2
Ravi Macha