我的Project A具有以下规格:
我的Project B具有以下规格:
两个项目均成功构建并单独运行。我希望项目A是项目B的依赖项。我正在使用IntelliJ,并遵循网络上可用的步骤(#1,#2),但这是我所做的要旨:
文件->项目结构
我成功运行了“ mvn clean install”。当我在Tomcat上运行Project B时,我得到:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-08-14 15:01:03.796 ERROR 15888 --- [on(3)-127.0.0.1] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
我不确定为什么项目A的JPA / DB配置会在项目B中引起问题,即使项目A本身可以正常工作。但是,经过一些研究,我在SpringBoot应用程序中添加了以下注释:
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
这就是我最终得到的:
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class ProjectB extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ProjectB.class);
}
public static void main(String[] args) {
SpringApplication.run(ProjectB.class, args);
}
}
我成功运行了“ mvn clean install”。我再次运行项目B,它成功启动!当我尝试引用项目A(即服务)中的任何内容时,它都可以正常运行,但是在启动时,我得到以下信息:
SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
***************************
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
APPLICATION FAILED TO START
***************************
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736)
Description:
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Parameter 0 of constructor in com.projectB.controller.ControllerName required a bean of type 'com.projecta.service.ServiceName' that could not be found.
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
Action:
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
Consider defining a bean of type 'com.projecta.service.ServiceName' in your configuration.
是否甚至可以将Spring模块导入Spring Boot 2?如果是这样,我想念什么?如果没有,我有什么选择?
编辑1:添加简单服务(项目A)+控制器(项目B)
// Controller in Project B
@RestController
@RequestMapping("/api")
public class SimpleController {
private SimpleService simpleService;
@Autowired
public SimpleController(SimpleService simpleService) {
this.simpleService = simpleService;
}
@GetMapping
public ResponseEntity<?> generateAndSendEmail() {
boolean success = simpleService.callSimpleService();
if (success) {
return new ResponseEntity<>(OK);
}
return new ResponseEntity<>(INTERNAL_SERVER_ERROR);
}
}
// Service in Project A
@Service
public class SimpleService {
public boolean callSimpleService() {
return true;
}
}
答案 0 :(得分:0)
当将projectA作为maven依赖项包含在Project B中时,projectA中的所有类文件在您的类路径上都可用。没什么。
当您将服务添加为自动绑定的依赖项时,(项目B的)spring容器期望实现Bean在上下文中可用。
spring上下文将无法找到ServiceA的实现,因为它不会扫描projectA的软件包。 projectB中@ComponentScan的默认实现将仅识别在Project B子包中声明的bean。要使Project A中的bean在Project B中可用,您需要在Project B的主类中添加一个显式@ComponentScan,以指示spring进行扫描项目A中的软件包。
建议从项目A的pom文件中删除Spring 4.X依赖项
答案 1 :(得分:0)
您是否尝试过将服务作为Spring Boot应用程序的bean手动创建?在您的主要班级内:
@Bean
public SimpleService simpleService() {
return new SimpleService();
}