Spring 无法自动装配 class
Spring can't autowire class
我有以下 Spring @Configuration:
@Bean
@Qualifier("mongo")
public MongoFacade mongo(Environment env){
final String host = env.getProperty("database.host");
final MongoClient mongoClient = new MongoClient(host);
return new MongoFacade(mongoClient, "test-db");
}
@Bean
public MessageStore<Event> eventStore(@Qualifier("mongo") MongoFacade mongo, ObjectMapper mapper) {
return new MongoMessageStore<>(mongo, mapper);
}
当我启动我的应用程序时抛出异常,原因是:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'eventStore' defined in it.m.MyConfiguration: Unsatisfied dependency expressed through constructor argument with index 0 of type [base.backend.persistence.impl.mongo.MongoFacade]: : No qualifying bean of type [base.backend.persistence.impl.mongo.MongoFacade] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=mongo)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [base.backend.persistence.impl.mongo.MongoFacade] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=mongo)}
MongoFacade
class 是真正的 class,并没有实现接口,我也尝试从方法中删除 Environment
依赖,但是还是不行。
删除 @Qualifier
注释错误是:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [base.backend.persistence.impl.mongo.MongoFacade] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
MongoFacade 是 MongoClient class 的简单外观,可与我的 PersistenceId class:
一起使用
public class MongoFacade {
public static final String DEFAULT_NAME = "default";
private final MongoClient mongo;
private final String defaultName;
public MongoFacade(MongoClient mongoClient) {
this(mongoClient, DEFAULT_NAME);
}
public MongoFacade(MongoClient mongoClient, String defaultName) {
this.mongo = mongoClient;
this.defaultName = defaultName;
}
public Document findOne(PersistenceId id){
final MongoCollection<Document> collection = collection(id);
final String documentId = documentId(id);
return collection.find(eq("_id", documentId)).first();
}
public UpdateResult updateOne(PersistenceId id, Document update) {
final MongoCollection<Document> collection = collection(id);
final String documentId = documentId(id);
return collection.updateOne(eq("_id", documentId), update);
}
环境可以作为字段而不是构造函数注入,我也建议使用方法调用而不是自动连接依赖项。
类似下面的内容
@Autowired
private Environment env;
@Bean
public MongoFacade mongoFacade(){
final String host = env.getProperty("database.host");
final MongoClient mongoClient = new MongoClient(host);
return new MongoFacade(mongoClient, "test-db");
}
@Bean
public MessageStore<Event> eventStore(ObjectMapper mapper) {
return new MongoMessageStore<>(mongoFacade(), mapper);
}
编辑: 添加了 Spring 启动 MongoDB 配置
从评论中可以清楚地看出您正在使用 Spring 引导,这已经 auto configures a MongoClient
for you. Instead of doing it yourself you can reduce your configuration a little further. (Se also MongoAutoConfiguration
)。
在你的application.properties
中添加
spring.data.mongodb.host=<value of current database.host>
或者如果它是一个完整的 URI
spring.data.mongodb.uri=<value of current database.host>
然后更改配置 class。
@Bean
public MongoFacade mongoFacade(MongoClient mongoClient){
return new MongoFacade(mongoClient, "test-db");
}
@Bean
public MessageStore<Event> eventStore(ObjectMapper mapper) {
return new MongoMessageStore<>(mongoFacade(null), mapper);
}
Spring 引导现在将构造一个 MongoClient
。
你可以在声明 bean 定义时使用 @Service 而不是 @qualifier
@Service("mongo")
public MongoFacade mongoFacade()
告诉我它是否适合你。
我有以下 Spring @Configuration:
@Bean
@Qualifier("mongo")
public MongoFacade mongo(Environment env){
final String host = env.getProperty("database.host");
final MongoClient mongoClient = new MongoClient(host);
return new MongoFacade(mongoClient, "test-db");
}
@Bean
public MessageStore<Event> eventStore(@Qualifier("mongo") MongoFacade mongo, ObjectMapper mapper) {
return new MongoMessageStore<>(mongo, mapper);
}
当我启动我的应用程序时抛出异常,原因是:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'eventStore' defined in it.m.MyConfiguration: Unsatisfied dependency expressed through constructor argument with index 0 of type [base.backend.persistence.impl.mongo.MongoFacade]: : No qualifying bean of type [base.backend.persistence.impl.mongo.MongoFacade] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=mongo)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [base.backend.persistence.impl.mongo.MongoFacade] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=mongo)}
MongoFacade
class 是真正的 class,并没有实现接口,我也尝试从方法中删除 Environment
依赖,但是还是不行。
删除 @Qualifier
注释错误是:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [base.backend.persistence.impl.mongo.MongoFacade] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
MongoFacade 是 MongoClient class 的简单外观,可与我的 PersistenceId class:
一起使用public class MongoFacade {
public static final String DEFAULT_NAME = "default";
private final MongoClient mongo;
private final String defaultName;
public MongoFacade(MongoClient mongoClient) {
this(mongoClient, DEFAULT_NAME);
}
public MongoFacade(MongoClient mongoClient, String defaultName) {
this.mongo = mongoClient;
this.defaultName = defaultName;
}
public Document findOne(PersistenceId id){
final MongoCollection<Document> collection = collection(id);
final String documentId = documentId(id);
return collection.find(eq("_id", documentId)).first();
}
public UpdateResult updateOne(PersistenceId id, Document update) {
final MongoCollection<Document> collection = collection(id);
final String documentId = documentId(id);
return collection.updateOne(eq("_id", documentId), update);
}
环境可以作为字段而不是构造函数注入,我也建议使用方法调用而不是自动连接依赖项。
类似下面的内容
@Autowired
private Environment env;
@Bean
public MongoFacade mongoFacade(){
final String host = env.getProperty("database.host");
final MongoClient mongoClient = new MongoClient(host);
return new MongoFacade(mongoClient, "test-db");
}
@Bean
public MessageStore<Event> eventStore(ObjectMapper mapper) {
return new MongoMessageStore<>(mongoFacade(), mapper);
}
编辑: 添加了 Spring 启动 MongoDB 配置
从评论中可以清楚地看出您正在使用 Spring 引导,这已经 auto configures a MongoClient
for you. Instead of doing it yourself you can reduce your configuration a little further. (Se also MongoAutoConfiguration
)。
在你的application.properties
中添加
spring.data.mongodb.host=<value of current database.host>
或者如果它是一个完整的 URI
spring.data.mongodb.uri=<value of current database.host>
然后更改配置 class。
@Bean
public MongoFacade mongoFacade(MongoClient mongoClient){
return new MongoFacade(mongoClient, "test-db");
}
@Bean
public MessageStore<Event> eventStore(ObjectMapper mapper) {
return new MongoMessageStore<>(mongoFacade(null), mapper);
}
Spring 引导现在将构造一个 MongoClient
。
你可以在声明 bean 定义时使用 @Service 而不是 @qualifier
@Service("mongo")
public MongoFacade mongoFacade()
告诉我它是否适合你。