Как исправить исключение Spring Boot «Поле ... требуется компонент типа ... который не может быть найден» - PullRequest
1 голос
/ 01 мая 2019

Я работаю с учебником весенней загрузки из javabrains , и все было ясно, пока не поместили CrudRepository в проект.Ниже вы можете найти мой основной класс:

package pl.springBootStarter.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CourseApiDataApplication
{
    public static void main(String args[])
{
    SpringApplication.run(CourseApiDataApplication.class,args);
}
}

Класс обслуживания:

package pl.springBootStarter.app.topic;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class TopicService
{
    @Autowired
    private TopicRepository topicRepository;

    private List<Topic> topics =  new ArrayList<>(Arrays.asList(
            new Topic("spring","spring framework", "spring framework dectription"),
            new Topic("sprin","spring framework", "spring framework dectription"),
            new Topic("spri","spring framework", "spring framework dectription")));

    public  List<Topic> getAllTopics()
    {
    //    return topics;
    List<Topic> t = new ArrayList<Topic>();
    topicRepository.findAll().forEach(t::add);
    return t;
    }

    public Topic getTopic (String id)
    {
        return   topics.stream().filter( t -> t.getId().equals(id)).findFirst().get();
    }

    public void addTopic(Topic topic) {
        topicRepository.save(topic);
    }

    public void updateTopic(Topic topic, String id)
    {
        topics.set(topics.indexOf(topics.stream().filter(t-> t.getId().equals(id)).findFirst().get()), topic);
    }

    public void deleteTopic(String id)
    {
        topics.remove(topics.stream().filter(t -> t.getId().equals(id)).findFirst().get());
    }
}

И Repository Интерфейс:

package pl.springBootStarter.app.topic;

import org.springframework.data.repository.CrudRepository;

public interface TopicRepository extends CrudRepository<Topic,String>
{

}

Когда я запускаю приложение тампроблема с внедрением TopicRepository в поле topicRepository в классе TopicService.Я получаю следующую ошибку:

Error starting ApplicationContext. To display the conditions report re-       run your application with 'debug' enabled.
2019-05-01 10:33:52.206 ERROR 6972 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field topicRepository in pl.springBootStarter.app.topic.TopicService required a bean of type 'pl.springBootStarter.app.topic.TopicRepository' that could not be found.

The injection point has the following annotations:
-    @org.springframework.beans.factory.annotation.Autowired(required=true)

В чем может быть причина того, что Spring не может выполнить автоматическое подключение?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Вы должны аннотировать TopicRepository как @Repository.

@Repository
public interface TopicRepository extends CrudRepository<Topic,String>
{
}

Также убедитесь, что класс сканируется весной (это может помочь, если это проблема: Проблемы с Intellij Springboot при запуске ).

См. Демонстрационный код здесь: https://github.com/lealceldeiro/repository-demo

1 голос
/ 01 мая 2019

Spring не может внедрить bean-компонент, поскольку он не был создан.

Вы должны указать Spring генерировать реализацию объявленных интерфейсов репозитория, используя аннотацию @EnableJpaRepositories(basePackages={"pl.springBootStarter.app"}) для любого из ваших классов конфигурации или класса, помеченного @SpringBootApplication. Это должно исправить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...