Spring boot не запускается - определите bean-компонент типа 'TopicRepository' в конфигурации - PullRequest
1 голос
/ 17 июня 2019

Я следовал этим JavaBrains учебникам Spring Boot.

Моя структура проекта выглядит следующим образом:

enter image description here

CourseApiApp.java :

@SpringBootApplication
@ComponentScan(basePackages = {
    "com.bloodynacho.rishab.topics"
})
@EntityScan("com.bloodynacho.rishab.topics")
public class CourseApiApp {

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

TopicController.java :

@RestController
public class TopicController {

    @Autowired
    private TopicService topicService;

    @RequestMapping(
        value = "/topics"
    )
    public List<Topic> getAllTopcs() {
        return topicService.getAllTopics();
    }
}

TopicService.java :

@Service
public class TopicService {

    @Autowired
    private TopicRepository topicRepository;

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

Topic.java :

@Entity
public class Topic {
    @Id
    private String id;
    private String name;
    private String description;
}

TopicRepository.java :

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

pom.xml :

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Я использовал ломбок @Getter, @Getter и @AllArgsConstructor в Topic.java, но удалил его после прочтения одного из ответов здесь .

Я читаю это1 , это2 , это3

Тем не менее, я получаю

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

Description:
Field topicRepository in com.bloodynacho.rishab.topics.TopicService required a bean of type 'com.bloodynacho.rishab.topics.TopicRepository' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.bloodynacho.rishab.topics.TopicRepository' in your configuration.
Process finished with exit code 1

РЕДАКТИРОВАТЬ: я прочитал это объясняя, как даже без реализации интерфейса @Autowired работает.Я понимаю решение, но я не понимаю, как решить мою проблему.Очевидно, что есть некоторые проблемы с настройкой и настройкой Spring Data (как указано в ответе)

1 Ответ

2 голосов
/ 17 июня 2019

Поскольку, если ваши другие иерархии пакетов находятся ниже вашего основного приложения с аннотацией @SpringBootApplication, вы защищены неявным сканированием компонентов.

Следовательно, одно простое решение можно сделать, выполнив 2 шага:

  1. Переименуйте пакет основного класса в com.bloodynacho.rishab.
    (Вот что я предполагаю, что полное имя пакета основного приложения должно быть корнем других пакетов.)
  2. Удалить аннотации @ComponentScan и @EntityScan.
    (Хотя @ComponentScan отличается от @EntityScan, в моем опыте его также можно удалить.)
...