我正在努力获取正确的多模块Spring Boot Maven项目设置。有没有我可以参考的示例项目?目前,我的项目结构如下。
数据模块: 基本上是我的数据层。是包含我的POJO和数据库存储库接口(PagingAndSortingRepository)。该模块将是项目中其他模块的依赖项。目前,我已经在模块中放置了一个Config类,如下所示
public class Config { @Configuration @Profile("cloud") static class CloudConfiguration extends AbstractCloudConfig { @Bean public DataSource dataSource() { return connectionFactory().dataSource("session-questions-sql", new DataSourceConfig(new PoolConfig(4, 4), new ConnectionConfig(""))); } } @Configuration @Profile("default") static class LocalConfiguration { } }
我认为此配置在其他两个模块之间是通用的,因此它属于数据模块。
文本模块: 这是一个非常简单的模块,它包含一个REST API控制器,当将文本消息发送到某个电话号码时将被调用。它将文本消息存储在DB中,并使用cdata模块中的存储库接口之一来执行此操作。该模块被构建为可执行的jar文件,并且包含实现EmbeddedServletContainerCustomizer的类。
@Configuration @ComponentScan @EnableAutoConfiguration @EnableJpaRepositories public class App implements EmbeddedServletContainerCustomizer { public static void main(String[] args) throws Exception { SpringApplication.run(App.class, args); } @Override public void customize(ConfigurableEmbeddedServletContainer container) { //Enabled UTF-8 as the default character encoding for static HTML resources. //If you would like to disable this comment out the 3 lines below or change //the encoding to whatever you would like. MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT); mappings.add("html", "text/html;charset=utf-8"); container.setMimeMappings(mappings ); } }
当我运行jar时,出现错误,提示rest控制器类无法从数据模块自动装配bean。我看到一些帖子说您应该将包名称添加到@ComponentScan批注中。例如
@ComponentScan(“ com.example.data”)
这样做将使嵌入式tomcat服务器启动,但是我认为单独添加该程序包会使Spring在文本模块中找不到我的REST控制器,因为在访问API时会收到404。所以我也添加了文本包
@ComponentScan({“ com.example.data”,“ com.example.text”})
但是,这又使我回到了相同的错误,Spring无法从数据模块中找到我的bean,无法自动装配到我的REST控制器。
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) at java.lang.Thread.run(Thread.java:744) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'twilioController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.data.controllers.QuestionRepo com.example.questions.text.controller.TwilioController.questionRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.data.controllers.QuestionRepo] 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:292) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:648) at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) at org.springframework.boot.SpringApplication.run(SpringApplication.java:909) at org.springframework.boot.SpringApplication.run(SpringApplication.java:898) at com.example.text.App.main(App.java:34) ... 6 more Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.data.controllers.QuestionRepo com.example.text.controller.TwilioController.questionRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.data.controllers.QuestionRepo] 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$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 22 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.data.controllers.QuestionRepo] 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.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ... 24 more
有人对如何正确执行操作有任何指示吗?
系统会自动从您的应用程序类的软件包(用注释的包)中扫描存储库@EnableAutoConfiguration。如果该默认设置不适合您,则可以轻松@EnableJpaRepositories使用相关软件包。
@EnableAutoConfiguration
@EnableJpaRepositories
我可以看到com.example.data和com.example.text。我想您可能有一个针对特定项目的软件包,com.example可能范围太广。因此,解决此问题的一种方法是将您的应用程序放入com.example(或应用程序的根包中)。
com.example.data
com.example.text
com.example
还要检查文档