我有一个带myapp-core和myapp-web模块的myapp父pom类型maven项目。 myapp-core模块作为依赖项添加到myapp-web。
myapp-core模块中的所有类都位于root包 com.myapp.core 中,myapp-web模块中的所有类都位于root包 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 App 它工作正常。但如果我将其作为运行方式 - >运行Java应用程序它失败了,错误地说它无法在myapp-core模块中找到bean。
如果我将Application.java
移动到com.myapp
包,它就可以了。
它应该工作,即使我也将它作为Java应用程序运行,对吗?
答案 0 :(得分:14)
启用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
我可以使用运行方式 - >运行它Java应用程序。
但是当运行为 - >时仍不确定它是如何正常工作的Spring Boot App !!
无论如何,我认为最好将我的Application.java
移到com.myapp
包,而不是与SpringBoot打架!
答案 1 :(得分:0)
我有同样的问题。只添加@EnableJpaRepositories注释可以解决问题。我试图在@SpringBootApplication中定义basePackages,但无济于事。 我认为Application类的包被提供给JpaRepositories的扫描过程,但是@SpringBootApplication中定义的其他包将被忽略。 它看起来像是Spring Boot的bug /改进。
答案 2 :(得分:0)
我在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;
}
}