[英]SpringBoot ComponentScan issue with multi-module project
我有一个myapp父pom类型的maven项目,其中包含myapp-core和myapp-web模块。 将myapp-core模块作为对myapp-web的依赖项添加。
myapp-core模块中的所有类都位于根包com.myapp.core中,myapp-web模块中的所有类均位于根包com.myapp.web中
主Application.java也位于com.myapp.web包中。 因为我的核心模块根包不同,所以我包括了ComponentScan的通用基本包“ com.myapp” ,如下所示:
@Configuration
@ComponentScan(basePackages="com.myapp")
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
现在令人惊讶的是,如果我使用“运行方式”->“ Spring Boot应用程序”来运行此应用程序,它运行良好。 但是,如果我以运行方式-> Java应用程序的身份运行它,则会失败并显示错误消息,提示它找不到在myapp-core模块中定义的bean。
如果我将Application.java
移到com.myapp
包中,则可以正常工作。 即使我也将其作为Java应用程序运行,它也应该起作用,对吗?
在为spring启用调试日志级别并浏览大量日志后,我发现扫描各种组件(如JPA存储库,JPA实体等)取决于Application.java的程序包名称。
如果JPA存储库或实体不在Application.java
包的子包中,则我们需要按如下所示明确指定它们:
@Configuration
@ComponentScan(basePackages="com.sivalabs.jcart")
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages="com.sivalabs.jcart")
@EntityScan(basePackages="com.sivalabs.jcart")
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
通过上面的@EnableJpaRepositories
和@EntityScan
我可以使用Run @EntityScan
> Java Application来运行它。
但是仍然不确定运行方式-> Spring Boot App时它如何正常工作!
无论如何,我认为最好将Application.java
移到com.myapp
软件包中,而不是与SpringBoot战斗!
我也有同样的问题。 仅添加@EnableJpaRepositories批注可以解决此问题。 我试图在@SpringBootApplication中定义basePackages,但无济于事。 我认为Application类的软件包被馈送到JpaRepositories的扫描过程,但是@SpringBootApplication中定义的其他软件包将被忽略。 看起来像是Spring Boot的错误/改进。
我对Redis存储库有一个类似的问题,该问题以类似的方式解决:
@Configuration
@EnableConfigurationProperties({RedisProperties.class})
@RequiredArgsConstructor
@EnableRedisRepositories(basePackages = {"com.example.another"})
public class RedisConfig {
private final RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
template.setConnectionFactory(redisConnectionFactory);
template.afterPropertiesSet();
return template;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.