【问题标题】:Spring boot not scanning components and configurationsSpring Boot 不扫描组件和配置
【发布时间】:2019-11-12 08:50:40
【问题描述】:

我有一个多模块项目:

TOP_LEVEL
|-> core
|-> assetManager
'-> requestManager

所以,我有一个核心模块,核心模块中有应用程序类。

在我的assetManger build.gradle 我compile(project(:core))

应用程序主类在包中:核心模块的com.test.companydomain.core。 这个 Application 类用

注释
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager"})
@EnableJpaRepositories
class Application {

}

包内assetManager模块中有一个类ClientUtils:com.test.domain.assetManager.server.common.utils;

注释:

@Slf4j
@Configuration
@Component("clientUtils")

我在这个类中创建了一些 bean,它使用其他配置类来自动装配和创建 bean。

到目前为止,该 ClientUtils 类还没有生成 bean。

这可能是什么问题?

我看到的错误是

应用程序启动失败


说明:

Field locationService in com.test.companydomain.assetManager.server.vendor.converter.ExternalVendorPojoConversionHelper required a bean of type 
'com.test.companydomain.assetManager.server.common.utils.client.LocationService' that could not be found.

这个类LocationService也被@Component注解,以便spring创建它的bean。

【问题讨论】:

    标签: spring-boot autowired


    【解决方案1】:

    在您的应用程序中,主类存在于包com.test.companydomain.core 中,默认情况下,springboot 会扫描主应用程序当前包下的所有类和包以查找自动装配 bean。所以,你已经提供了注解@ComponentScan来明确告诉spring扫描其他包。但是你的util类在包com.test.domain.assetManager.server.common.utils中,它不包含在@ComponentScan注解中,所以它不是用于组件扫描。

    您可以尝试将包 com.test.domain 添加到主类中的组件扫描中,例如:

    @EnableAutoConfiguration
    @ComponentScan(basePackages = {"com.test.companydomain","com.test.domain"})
    @EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager","com.test.domain"})
    @EnableJpaRepositories
    class Application {
    
    }
    

    【讨论】:

    • 我想通了。我不知道为什么,但我必须创建一个命名 bean,这解决了我的问题。没有此错误的日志。有没有办法在调试中识别此类问题。即使我给了 debug: true for the application,我也找不到日志
    • 不过,你说的也对。但在这种情况下,com.test.companydomain 中的所有内容都会被拾取,即使它们位于不同的模块中。他们的组 id 是相同的,这就是我提供的。它有效。
    【解决方案2】:

    如果你使用的是 Spring Boot,你应该考虑使用 @SpringBootApplication 注解并配置基础包以使用 scanBasePackages 而不是 @ComponentScan 进行扫描:

    package com.test.companydomain.core;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication(scanBasePackages = "com.test.companydomain")
    @EntityScan({"com.test.companydomain", "com.test.companydomain.assetManager"})
    public class Application {
    
      public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
      }
    }
    

    默认情况下,Spring Boot 只扫描带有 @SpringBootApplication 注释的类及其子包的包。

    另外,@Configuration 使用@Component 进行元注释,因此@Configuration 类是组件扫描的候选对象,不应使用@Component 显式注释:

    package com.test.domain.assetManager.server.common.utils;
    
    @Configuration
    public class ClientUtils {
    
      @Autowired
      private ClientProperties properties;
    
      @Bean
      public TestClient testClient() {
        return new TestClient(properties); //example
      }
    }
    

    package com.test.companydomain.assetManager.server.common.utils.client;
    
    @Component
    public class LocationService {
      //...
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-13
      • 2019-01-11
      • 2015-12-12
      • 2019-02-16
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多