Проект модуля Spring Boot multi (maven) не может найти свой репозиторий — как это исправить?

#java #spring-boot #maven

#java #spring-boot #maven

Вопрос:

В качестве моего первого шага в освоении модулей Java 9 я сначала создаю Java-программу, которая находится во вложенных каталогах, к которым присоединен Maven корневого уровня pom.xml . То есть модули Java еще не задействованы.

Источником моей программы является программа Spring Boot, которая уже работает. Я разделил эту программу на контроллер (модуль доступа к Maven) и доступ к данным (модуль сохранения Maven). Моим наставником для этой задачи был этот весенний сайт: https://spring.io/guides/gs/multi-module / .

Я запускаю это с помощью визуального исходного кода, с Java 11 в моем JAVA_HOME. Запускается программа Spring Boot, затем выдает ошибку такого рода:

 Parameter 0 of constructor in com.logicaltiger.persistence.service.LocationService required a bean of type 'com.logicaltiger.persistence.repository.LocationRepository' that could not be found.
  

Программа работала до того, как я нарезал ее кубиками, так что моя проблема связана с конфигурацией Spring.

Мой запрос?Можно ли исправить мою конфигурацию, чтобы Spring Boot находил все ее части?

Приложение доступа имеет это:

 @SpringBootApplication(scanBasePackages = "com.logicaltiger")
@ComponentScan("com.logicaltiger")
@EnableAutoConfiguration
public class AccessApplication {

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

}
  

LocationService имеет это:

 @Service
[snip]

private final LocationRepository locationRepository;

public LocationService(LocationRepository locationRepository) {
    this.locationRepository = locationRepository;
}
  

LocationRepository имеет это:

 @Repository
public interface LocationRepository extends CrudRepository<Location, Long> {
  

Это моя структура каталогов, игнорирующая .mvn и т. Д.

 district-updater-modules
    access
        src
            main
                java
                    com
                        logicaltiger
                            access
                                controller
                                    (various controller files, with @Controller annotation)
                                util
                                     Utilities.java
                                AccessApplication.java
                resources
                    static
                    templates
                    application.properties
        pom.xml
    persistence
            main
                java
                    com
                        logicaltiger
                            persistence
                                model
                                    (various model files)
                                repository
                                    LocationRepository.java
                                service
                                    LocationService.java
                                util
                                     Utilities.java
                                AccessApplication.java
                resources
        pom.xml
    pom.xml
  

The root pom.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" [snip] >
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.logicaltiger</groupId>
    <artifactId>district-updater-modules</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>district-updater-modules</name>
    <description>Wrapper for the modules of DistrictUpdater -- Java modules</description>
    <packaging>pom</packaging>

    <modules>
        <module>access</module>
        <module>persistence</module>
    </modules>

</project>
  

The access pom.xml (some dependencies omitted):

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" [snip] >
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.logicaltiger.access</groupId>
    <artifactId>access</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>district-updater-modules-access</name>
    <description>DistrictUpdater web API access module</description>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.logicaltiger</groupId>
            <artifactId>persistence</artifactId>
            <version>${project.version}</version>
        </dependency>    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  

Постоянство pom.xml (некоторые зависимости опущены):

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" [snip] >
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.logicaltiger</groupId>
    <artifactId>persistence</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>district-updater-modules-persistence</name>
    <description>DistrictUpdater persistence module</description>
    <packaging>jar</packaging>

    <properties>
        <java.version>11</java.version>
    </properties>

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

</project>
  

Спасибо,

Джером.

Комментарии:

1. Будьте осторожны, добавляя в программу инструкции, которые вы на самом деле не понимаете, в надежде решить проблему. @SpringBootApplication уже подразумевает @ComponentScan и @EnableAutoConfiguration . Вам также не нужен @Repository репозиторий данных Spring. Наконец, я отмечаю, что у вас, похоже, несколько копий Application класса, что может быть проблемой.

2. Согласно предложению, я удалил эти выделенные аннотации без какого-либо чистого эффекта. Я не вижу, где у меня есть несколько классов приложений. Вы путаете SpringBootApplication (аннотацию) с SpringApplication (который запускает мое приложение доступа)?

Ответ №1:

После долгих поисков и экспериментов я, наконец, нашел решение здесь.

В дополнение к @ComponentScan("com.logicaltiger") вам также нужно

  • @EnableJpaRepositories(basePackages = "com.logicaltiger") чтобы найти все репозитории,
  • а также @EntityScan("com.logicaltiger.*") для того, чтобы найти все объекты.

Следовательно:

 @SpringBootApplication(scanBasePackages = "com.logicaltiger")
@ComponentScan("com.logicaltiger")
@EnableJpaRepositories(basePackages = "com.logicaltiger")
@EntityScan("com.logicaltiger.*")
@EnableAutoConfiguration
public class AccessApplication {

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

}