Spring Boot Отдельные модули для API, интерфейса и реализации - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь создать один проект, который имеет три подмодуля для API (веб), интерфейса и реализации.

Структура дерева каталогов похожа на

spring-multi-module
--spring-api
--spring-service-server
--spring-service-stub
  • Идея состоит в том, что модуль spring-api будет просто содержать код, связанный с контроллерами и сетью, а pom.xml имеет пружинную сеть и spring-service-stub зависимости.
  • Модуль spring-service-server будет содержать код, связанный с конфигурацией базы данных и всеми реализациями службы, а pom.xml будет содержать базу данных и spring-service-stub зависимости.
  • и модуль spring-service-stub будет содержать только интерфейсы и VO, которые используются spring-api и spring-service-server.

pom.xml файл spring-multi-module

<modules>
        <module>spring-api</module>
        <module>spring-service-server</module>
        <module>spring-service-stub</module>
    </modules>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <packaging>pom</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

pom.xml из spring-api

<parent>
        <artifactId>demo</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-api</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>spring-service-stub</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

UserSerivce.java - это интерфейс в модуле spring-service-stub, и его реализация выполняется в модуле spring-service-server. UserController.java имеет объект с автопроводкой UserService.

И проблема в том, что когда я пытаюсь запустить класс SpringBootApplication из spring-api, в журнале появляется следующая ошибка

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

Description:

Field userService in com.example.demo.api.controller.UserController required a bean of type 'com.example.demo.service.UserService' that could not be found.


Action:

Consider defining a bean of type 'com.example.demo.service.UserService' in your configuration.

Полный код также добавлен на GitHub, вы можете найти от https://github.com/vinitsolanki/spring-multi-module

Просто, если я добавлю использование @Import({SpringAppStub.class, SpringAppServer.class}) вместо @Import(SpringAppStub.class) в SpringAppApiConfig, то это также сработает. Это означает, что я распространяю все сущности и репозиторий на модуль spring-api, который я не хочу.

Ответы [ 2 ]

1 голос
/ 24 марта 2019

По умолчанию Spring сканирует все классы в подпакете класса @SpringBootApplication. Так как классы UserController, UserService и т. Д. Не входят в подпакеты, необходимо добавить

@ComponentScan(basePackages = {"com.example"})
@SpringBootApplication
public class SpringAppApi {
0 голосов
/ 25 марта 2019

В вашем проекте 3 модуля

spring-api 
spring-service-server
spring-service-stub

spring-service-server зависит от spring-service-stub

spring-api зависит от spring-service-stub

Если вы видите эту настройку, spring-service-server

не задействован

В идеале так должно быть

spring-api должен зависеть от spring-service-server

Вы можете изменить свой spring-api => pom.xml

удалить stub зависимость и добавить

<dependency>
    <groupId>com.example</groupId>
    <artifactId>spring-service-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

И все должно работать просто отлично.

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