繁体   English   中英

SpringBoot ComponentScan与多模块项目有关的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM