Spring 启动时不扫描组件和配置
Spring boot not scanning components and configurations
我有一个多模块项目:
TOP_LEVEL
|-> core
|-> assetManager
'-> requestManager
所以,我有一个核心模块,在核心模块中有应用程序 class。
在我的 assetManger build.gradle 我 compile(project(:core))
应用程序 main class 位于核心模块的包 : com.test.companydomain.core
中。
此应用程序 class 带有
注释
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager"})
@EnableJpaRepositories
class Application {
}
包中的 assetManager 模块中有一个 class ClientUtils : com.test.domain.assetManager.server.common.utils;
注释为:
@Slf4j
@Configuration
@Component("clientUtils")
我在这个 class 中创建了 bean,它使用其他配置 classes 来自动装配和创建 bean。
目前尚未从该 ClientUtils class 生成 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.
此 class LocationService 也使用 @Component 进行注释,以便 spring 创建其 bean。
在您的应用程序中,主要 class 存在于包 com.test.companydomain.core
中,默认情况下 springboot 扫描当前包下的所有 classes 和包自动装配 bean 的主要应用程序。因此,您提供了注释 @ComponentScan
以明确告诉 spring 扫描其他包,因为 well.But 您的 util
class 在包 com.test.domain.assetManager.server.common.utils
中, 不包含在 @ComponentScan
注释中,因此不会被组件扫描占用。
您能否尝试将包 com.test.domain 添加到主 class 中的组件扫描中,例如:
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain","com.test.domain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager","com.test.domain"})
@EnableJpaRepositories
class Application {
}
如果您正在使用 Spring 引导,您应该考虑使用 @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 引导仅扫描 class 注释的包 @SpringBootApplication
及其子包。
此外,@Configuration
是用 @Component
进行元注释的,因此 @Configuration
class 是组件扫描的候选对象,不应使用 [=18] 显式注释=]:
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 {
//...
}
我有一个多模块项目:
TOP_LEVEL
|-> core
|-> assetManager
'-> requestManager
所以,我有一个核心模块,在核心模块中有应用程序 class。
在我的 assetManger build.gradle 我 compile(project(:core))
应用程序 main class 位于核心模块的包 : com.test.companydomain.core
中。
此应用程序 class 带有
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager"})
@EnableJpaRepositories
class Application {
}
包中的 assetManager 模块中有一个 class ClientUtils : com.test.domain.assetManager.server.common.utils;
注释为:
@Slf4j
@Configuration
@Component("clientUtils")
我在这个 class 中创建了 bean,它使用其他配置 classes 来自动装配和创建 bean。
目前尚未从该 ClientUtils class 生成 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.
此 class LocationService 也使用 @Component 进行注释,以便 spring 创建其 bean。
在您的应用程序中,主要 class 存在于包 com.test.companydomain.core
中,默认情况下 springboot 扫描当前包下的所有 classes 和包自动装配 bean 的主要应用程序。因此,您提供了注释 @ComponentScan
以明确告诉 spring 扫描其他包,因为 well.But 您的 util
class 在包 com.test.domain.assetManager.server.common.utils
中, 不包含在 @ComponentScan
注释中,因此不会被组件扫描占用。
您能否尝试将包 com.test.domain 添加到主 class 中的组件扫描中,例如:
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain","com.test.domain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager","com.test.domain"})
@EnableJpaRepositories
class Application {
}
如果您正在使用 Spring 引导,您应该考虑使用 @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 引导仅扫描 class 注释的包 @SpringBootApplication
及其子包。
此外,@Configuration
是用 @Component
进行元注释的,因此 @Configuration
class 是组件扫描的候选对象,不应使用 [=18] 显式注释=]:
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 {
//...
}