Spring Boot не может автоматически подключить компонент с абстрактным и интерфейсом - PullRequest
0 голосов
/ 25 июня 2018

В моем приложении Spring Boot 2.0.2 я пытаюсь внедрить компонент, унаследованный от абстрактного класса, который реализует интерфейс, и он не работает.

Код:

Аннотация компонента: (Нужно ли ставить @Component?)

package app.project.service;

@Component
public abstract class AbstractStepService implements IStepService {

    protected final void addTask() {
        ...
    }

    @Override
    public StepDataDto launch() throws StepException {
        ...
    }
}

Интерфейс:

package app.project.service;

public interface IStepService  {
    StepDataDto launch() throws StepException;
}

package app.project.service;

Компонент:

@Component
public class CStepServiceImpl extends AbstractStepService implements IStepService {

    @PostConstruct
    private void defineTasks() {
    }
}

package app.project.service;

Тест Junit:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CStepServiceTest {

    @Autowired
    @Qualifier("cStepServiceImpl")
    private IStepService service;

}

package app.project;

Применение:

@SpringBootApplication
@ComponentScan(basePackages ={"app.project.service"})
public class MyApplication {}

Сообщение об ошибке призапуск моего теста Junit:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'app.project.service.IStepService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=cStepServiceImpl)}

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 25 июня 2018

Измените свою декларацию следующим образом

@Autowired
@Qualifier("CStepServiceImpl")
private IStepService service;

или

@Autowired
private IStepService CStepServiceImpl;  

Это должно сработать. Имя bean-компонента, автоматически созданное Spring, имеет имя CStepServiceImpl.

Вы также можете назвать свой боб следующим образом

@Component(value = "myName")
public class CStepServiceImpl extends AbstractStepService implements IStepService {

}

и используйте myName во время автоматической проводки.

...