设置第二个 Springboot 应用程序以使用 App 1 中的 @Autowired 存储库 @Component 导致加载不正确并且 REST 请求中断

Setting up a 2nd Springboot application to use a @Autowired repository @Component from App 1 caused incorrect loading and REST requests broke

我安装了 2 个 Spring Boot 应用程序。我正在尝试 @Autowire Application 2Application 1 的存储库。

这两个应用程序都将使用 REST 来回通信。当我 运行 application 2 单独没有 Application 1 存储库的 @Autowire 时,我可以通过 @RestController [=26= 正确地与 http://localhost:8082/runTestExecution 通信] class没有问题。

当我设置 @Autowire@ComponentScan({"com.miw.mcb.server.repositories"}) 以便我可以访问 Application 1 的存储库时,Application 2 不再正常运行。

我无法在 http://localhost:8082/runTestExecution 到达 @RestController

我还有一个 class,它实现了 CommandLineRunner,当我启动 Spring Boot 时,它会 运行 而这也不再是 运行。

@Component
public class InitialRunner implements CommandLineRunner 
  1. 这是一个问题吗,因为 Application 1 也有一个加载 @SpringBootApplication 的主 class?
  2. 任何人都可以提出问题所在吗?

下面概述了将 Application 1@Autowired class 的罐子添加到 Application 2

的步骤

以下是我采取的步骤:

  1. 设置maven以拥有新的库依赖并将其添加到maven库mvn:install

  2. 将自动装配 bean 添加到 HomeController class:

    @RestController
    public class HomeController {
    
        @Autowired
        TestSuiteRepository repo;
    
        @RequestMapping(value = "/")
        public String index() {
            return "index";
        }
    
        @RequestMapping("runTestExecution")
        public String runTestExecution(@RequestParam(value = "testExecutionID", required = true) String testExecutionID) {
    
            return "Good";
        }
    }
    

主要class

  @SpringBootApplication
  public class AdbService {

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

TestResultRepository class

package com.miw.mcb.server.repositories;

@Component
public interface TestResultRepository extends PagingAndSortingRepository<TestResult, Long> {
  }
  1. 添加@Configuration@ComponentScan,只提供JAR文件的repositories包的注释扫描

Application 2 主要 class

    @Configuration
    @ComponentScan({"com.miw.mcb.server.repositories"})
    @SpringBootApplication
    public class AdbService {

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

Application 1 配置 Class

@Configuration
@ComponentScan({"com.miw.mcb.server.repositories"})
public class AppConfig {

}

Application 1 主要 class

@SpringBootApplication
public class ReactAndSpringDataRestApplication {

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

在添加 @ComponentScan 之前,我得到了以下堆栈跟踪:

2016-04-14 13:29:56 - Application startup failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.miw.mcb.server.repositories.TestSuiteRepository com.miw.mcb.adbservice.HomeController.repo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.miw.mcb.server.repositories.TestSuiteRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) at com.miw.mcb.adbservice.AdbService.main(AdbService.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:478) at java.lang.Thread.run(Thread.java:745)

尝试对 JpaRepositories 使用 @EnableJpaRepositories 而不是 @ComponentScan:

@Configuration
//@ComponentScan({"com.miw.mcb.server.repositories"})
@EnableJpaRepositories("com.miw.mcb.server.repositories")
@SpringBootApplication
public class AdbService {

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