Пакет не найден (мультимодульный весенний проект) - PullRequest
0 голосов
/ 11 января 2019

Я использовал Spring Initializr для создания двух модулей:

API (который является Spring Web)

дБ (то есть Spring Data MongoDB)

Я поместил их в один и тот же проект, так что теперь они являются подмодулями.

Перед созданием тестов я могу mvn clean install с сообщением BUILD SUCCESS. Там нет проблем.

Однако, если я пытаюсь создать тест (или даже использовать его в контроллере в структуре main ), где он использует класс репозитория модуля db для получения данных из MongoDB, mvn clean install будет обвинять, что пакет не существует, несмотря на то, что IntelliJ может его идентифицировать и проиндексировать, и файл существует.

Структура:

api
\- src/main/java
  \- com.example.api.controllers
    \- UserController.java
\- src/test/java
  \- com.example.api.controllers
    \- UserControllerTest.java
db
\- src/main/java
  \- com.example.db.repositories
    \- UserRepository.java
model
\- src/main/java
  \- com.example.model
    \- User.java

ApiApplication.java

package com.example.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class ApiApplication {

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

}

UserController.java

package com.example.api.controllers;

import com.example.api.Constants;
import com.example.db.repositories.UserRepository;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping(Constants.V1 + "user")
    public User getUser() {
        User user = new User("John");
        userRepository.save(user);
        return user;
    }
}

Теперь, если я выполню mvn clean install, я получу ошибку maven, говорящую package com.example.db.repositories does not exist.

Модуль дБ является зависимостью в модуле api и api модуль должен быть скомпилирован после db в родительском pom.

родитель - pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>model</module>
        <module>db</module>
        <module>api</module>
    </modules>

</project>

дБ - pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>db</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

</project>

api - pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>LATEST</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>api</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <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>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>db</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

Как заставить maven увидеть этот пакет?

Новая ошибка после поиска пакета

2019-01-14 19:16:55.060  WARN 31104 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.db.repositories.UserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2019-01-14 19:16:55.066  INFO 31104 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-01-14 19:16:55.087  INFO 31104 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-01-14 19:16:55.224 ERROR 31104 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

Field userRepository in com.example.api.controllers.UserController required a bean of type 'com.example.db.repositories.UserRepository' 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.example.db.repositories.UserRepository' in your configuration.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Вы (пере) упаковываете db как загрузочное «приложение» Spring, а не как библиотеку, используя spring-boot-maven-plugin:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Файл jar переупакован , добавив пакет com.example.db.repositories (и его классы) в папку BOOT-INF. Это приводит к ошибке компиляции.

Boot-repackage

Просто удалите деталь <plugin>..</plugin> из db/pom.xml. Это создаст обычный jar-файл, который можно импортировать в модуль api.

Jar

Примечание. Я предполагаю, что api имеет класс Main и будет упакован как загрузочное приложение.

0 голосов
/ 15 января 2019

Автообнаружение Springboot будет происходить только из вашего класса конфигурации вниз. ваша заявка на

com.example.api

но репо на

com.example.db

либо добавьте путь поиска к автообнаружению .db, либо переместите класс приложения в com.example, либо код базы данных в com.example.api

Вариант 1

@ComponentScan(“com.example”)
@SpringBootApplication
public class ExampleApplication  {

Вариант 2

@ComponentScan({"com.example.api","com.example.db"})
@SpringBootApplication
public class ExampleApplication {

Вы можете также добавить атрибут scanBasePackages в аннотацию SpringbootApplication для того же эффекта.

@SpringBootApplication(scanBasePackages= {"com.example.api","com.example.db"})
public class ExampleApplication {

см. Документы здесь https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html#scanBasePackages--

0 голосов
/ 11 января 2019

Действительно, API должен видеть класс БД.

Убедитесь, что:

  1. Родительский проект относится к типу упаковки pom (<packaging>pom</packaging>)
  2. Версия, если зависимость ?api совпадает с версией bdb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...