用于API,接口和实现的Spring Boot Separate模块

时间:2019-03-24 11:08:10

标签: java spring spring-boot multi-module spring-bean

我正在尝试构建一个项目,该项目包含用于api(web),接口和实现的三个子模块。

目录树结构类似于

spring-multi-module
--spring-api
--spring-service-server
--spring-service-stub
  • 一个想法是模块spring-api仅包含与控制器和Web相关的代码,而pom.xml具有spring web和spring-service-stub依赖性。
  • 模块spring-service-server将包含与数据库配置和所有服务实现相关的代码,而pom.xml将包含数据库和spring-service-stub依赖性。
  • ,模块spring-service-stub将仅包含接口 spring-apispring-service-server使用的VO。
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 of 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.javaspring-service-stub模块中的接口,其实现在spring-service-server模块上。 UserController.java具有自动连接的UserService对象。

问题是,当我尝试从spring-api运行SpringBootApplication类时,在日志上出现以下错误

***************************
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 个答案:

答案 0 :(得分:1)

默认情况下,Spring扫描@SpringBootApplication类的子包中的所有类。由于UserController,UserService等类不在子包中,因此您需要添加

@ComponentScan(basePackages = {"com.example"})
@SpringBootApplication
public class SpringAppApi {

答案 1 :(得分:0)

在您的项目中,您有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>

一切都应该正常工作。