SpringBoot无法识别多模块Java应用程序中另一个模块的RestController

时间:2016-05-10 08:35:43

标签: java maven intellij-idea spring-boot multi-module

我花了很长时间但是我无法解决这个(配置)问题。

技术堆栈: Java(1.8),Springboot(starter-parent,starter-web),Maven,IntelliJ IDEA

描述:尝试创建一个由两个模块组成的多模块Java应用程序:

  1. 核心模块:主模块(主要业务逻辑,每个其他模块都应该看到并通过这个模块进行交互)。该模块包含主要的应用程序类。
  2. webgateway 模块:简单的Rest控制器,用于映射请求并调用核心模块
  3. 问题: Springboot没有从webgateway module =>加载/扫描RestController。发送http请求时出现404错误

    Github repo https://github.com/Sorin-J/Greeter

    项目配置:

    Greeter 
       |
       + pom.xml (parent pom)
       |
       + -- core                                            
       |     |
       |     + ...
       |     |
       |     + pom.xml
       |
       + -- webgateway 
             |
             + ...
             |
             + pom.xml (depends on core pom.xml)
    

    父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.bet.jbs</groupId>
        <artifactId>Greeter</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <modules>
            <module>core</module>
            <module>webgateway</module>
        </modules>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    </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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    

    webgateway 模块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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>webgateway</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>com.bet.jbs</groupId>
                <artifactId>core</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </project>
    
    来自核心模块的

    MainApplication 类:

    package com.bet.jbs.core;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan(basePackages = {"com.bet.jbs.core", "com.bet.jbs.webgateway"})
    @EnableAutoConfiguration
    public class MainApplication {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(MainApplication.class, args);
        }
    }
    
    来自 webgateway 模块的

    GreetingController 课程:

    package com.bet.jbs.webgateway.controller;
    
    import com.bet.jbs.core.util.GreetingGenerator;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        @RequestMapping(value = "/webgreeting", method = RequestMethod.GET)
        public String getGreeting() {
            return "WEBGATEWAY module says " + GreetingGenerator.getRandomGreeting();
        }
    }
    

    只是为了测试一个相同的REST控制器如果它位于核心模块中就可以正常工作,我也在<?>中创建了一个类似的 GreetingController 类strong>核心模块(这个工作正常):

    package com.bet.jbs.core.controller;
    
    import com.bet.jbs.core.util.GreetingGenerator;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    /*
     * This REST controller should not be in the CORE component.
     * It is just for proving that this controller is recognized and the other one from WEBGATEWAY component is not.
     *
     */
    @RestController
    public class GreetingController {
    
        @RequestMapping(value = "/coregreeting", method = RequestMethod.GET)
        public String getGreeting() {
            return "CORE module says " + GreetingGenerator.getRandomGreeting();
        }
    }
    

3 个答案:

答案 0 :(得分:5)

spring boot主应用程序位于核心模块中,该模块不依赖于webgateway模块。 因此,具有控制器的类将不会在运行时出现,并且不能被spring发现。 修复:将依赖关系添加到webgateway到核心或将启动器/主类移动到webgateway模块。 您还可以使用第三个执行启动的模块,并具有核心和webgateway的依赖关系。

答案 1 :(得分:0)

从上一天开始,我就一直陷在这个问题中……下面的解决方案肯定会为您节省很多时间!

这是我解决的方法:

  1. sed主类创建一个单独的模块。

    x服务

    • pom.xml(父级)
    • child1-module
      • pom.xml
    • child2-module
      • pom.xml
    • 应用程序模块
      • pom.xml(包含对child1和child2的依赖性)
      • src / main / java / Application.java
  2. 将所有模块作为依赖项添加到具有应用程序类的模块的pom中。

    Application
  3. 将主pom保留为父pom。

     <?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">
     <parent>
         <artifactId>x-service</artifactId>
         <groupId>com.a.b.c</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
    
     <artifactId>app-module</artifactId>
    
     <dependencies>
         <dependency>
             <groupId>com.a.b.cs</groupId>
             <artifactId>child1-module</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>com.a.b.cs</groupId>
             <artifactId>child1-module</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
     </dependencies>
    
     <build>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>
             </resource>
         </resources>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <configuration>
                     <executable>true</executable>
                 </configuration>
             </plugin>
         </plugins>
     </build>
    
  4. 在所有子pom中将父pom artifect添加为父。

     <?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>
     <packaging>pom</packaging>
     <modules>
         <module>child1-module</module>
         <module>child2-module</module>
         <module>app-module</module>
     </modules>
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.1.2.RELEASE</version>
         <relativePath/>
     </parent>
    
     <groupId>com.a.b.c</groupId>
     <artifactId>x-service</artifactId>
     <version>0.0.1-SNAPSHOT</version>
    
     <properties>
         <java.version>1.8</java.version>
     </properties>
    
     <dependencies>
    
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
    
    
     </dependencies>
    
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-checkstyle-plugin</artifactId>
                 <version>3.0.0</version>
             </plugin>
         </plugins>
     </build>
    

答案 2 :(得分:0)

我已经添加了正确的依赖项,但 Spring Boot 仍然没有找到我的新控制器。添加模块时,似乎 IntelliJ IDEA (2020.3.2) 或 Maven (3.3.6) 没有正确更新。这为我解决了:

  1. 马文: 在父项目上清理 + 安装

  2. 在 IntelliJ 中的文件菜单 Invalidate Caches / Restart..