设置第二个 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 2
中 Application 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
- 这是一个问题吗,因为
Application 1
也有一个加载 @SpringBootApplication
的主 class?
- 任何人都可以提出问题所在吗?
下面概述了将 Application 1
和 @Autowired
class 的罐子添加到 Application 2
的步骤
以下是我采取的步骤:
设置maven以拥有新的库依赖并将其添加到maven库mvn:install
将自动装配 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> {
}
- 添加
@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);
}
}
我安装了 2 个 Spring Boot
应用程序。我正在尝试 @Autowire
Application 2
中 Application 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
- 这是一个问题吗,因为
Application 1
也有一个加载@SpringBootApplication
的主 class? - 任何人都可以提出问题所在吗?
下面概述了将 Application 1
和 @Autowired
class 的罐子添加到 Application 2
以下是我采取的步骤:
设置maven以拥有新的库依赖并将其添加到maven库
mvn:install
将自动装配 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> {
}
- 添加
@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);
}
}