#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);
}
}