Muk*_*and 4 autowired spring-boot
我有一个多模块项目:
TOP_LEVEL
|-> core
|-> assetManager
'-> requestManager
Run Code Online (Sandbox Code Playgroud)
所以,我有一个核心模块,核心模块中有 Application 类。
在我的 assetManger build.gradle 中我compile(project(:core))
应用程序主类位于com.test.companydomain.core核心模块的 package: 中。该应用程序类注释为
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager"})
@EnableJpaRepositories
class Application {
}
Run Code Online (Sandbox Code Playgroud)
包中的assetManager模块中有一个类ClientUtils:com.test.domain.assetManager.server.common.utils;
注释为:
@Slf4j
@Configuration
@Component("clientUtils")
Run Code Online (Sandbox Code Playgroud)
我在此类中创建了一些 bean,它使用其他配置类来自动装配和创建 bean。
到目前为止,Bean 尚未从此 ClientUtils 类生成。
这可能有什么问题?
我看到的错误是
应用程序无法启动
描述:
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.
Run Code Online (Sandbox Code Playgroud)
这个类LocationService也用@Component注解,以便spring创建它的bean。
在您的应用程序中,主类存在于包中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 {
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,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
}
}
Run Code Online (Sandbox Code Playgroud)
和
package com.test.companydomain.assetManager.server.common.utils.client;
@Component
public class LocationService {
//...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7864 次 |
| 最近记录: |