Невозможно обнаружить аннотацию хранилища в Spring Boot - PullRequest
0 голосов
/ 20 января 2020

У меня есть класс репозитория для пакета:

com.repository

И я определил @ComponentScan("com.*") в основном классе Spring Boot.

Однако при запуске приложения я получаю исключение

Рассмотрим определение bean-компонента типа 'com.repository.TopicRepository' в вашей конфигурации.

Ниже приведены классы:

TopicRepository

package com.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import com.models.Topic;


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



}

Приложение

package com.example.springboot.springboot.test;

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

@SpringBootApplication(scanBasePackages = "com.*")
public class Application {

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

}

POM. xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springboot</groupId>
<artifactId>springboot.test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot.test</name>
<description>Demo project for Spring Boot</description>


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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<properties>
    <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>

Я уже попробовал @ComponentScan. Если я изменю scanBasePackages на "com.repository", он сможет каким-то образом забрать TopicRepository вместе с другими Service and Controller, что не должно быть так, поскольку они находятся в другой упаковке.

РЕДАКТИРОВАТЬ:

структура пакета

com.models: Модели

com.repository: Репозиторий

com.services: Сервисы

com.controllers: контроллеры

com.springboot.springboottest: основной класс

1 Ответ

0 голосов
/ 20 января 2020

Из документации

Обычно мы рекомендуем размещать основной класс приложения в пакете root над другими классами. Аннотация @SpringBootApplication часто помещается в ваш основной класс, и неявно определяет базовый «пакет поиска» для определенных элементов .

Также как chrylis -on strike указывает в комментарии, базовый пакет должен быть определен как com. Сканирование начнется с пакета com и всех его подпакетов

@ ComponentScan ("com")

Обновление

На основе общей структуры пакета.

@SpringBootApplication(scanBasePackages = {"com.models","com.repository","com.services","com.controllers"})
public class Application {

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

}

или

@SpringBootApplication(scanBasePackages = "com")
public class Application {

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

}

должны работать.

Лучший вариант - переместить класс Application в Пакет com имеет следующую аннотацию.

@SpringBootApplication
public class Application {

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

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