Spring无法自动上课

时间:2015-06-30 10:41:58

标签: java spring spring-boot inversion-of-control

我有以下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类是一个真正的类,并且不实现接口,我也尝试从方法中删除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类的简单外观,适用于我的PersistenceId类:

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);
}

2 个答案:

答案 0 :(得分:2)

环境可以作为字段而不是构造函数注入。我建议使用方法调用而不是依赖项的自动连接。

如下所示

@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 Boot MongoDB配置

从评论中可以清楚地看到你正在使用Spring Boot,这已经是auto configuresMongoClient了。您可以自己进一步减少配置,而不是自己动手。 (也请MongoAutoConfiguration)。

application.properties添加

spring.data.mongodb.host=<value of current database.host>

或者如果是完整的URI

spring.data.mongodb.uri=<value of current database.host>

然后更改配置类。

@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 Boot现在将构建一个MongoClient

答案 1 :(得分:0)

你可以在声明bean定义时使用@Service而不是@qualifier

@Service("mongo")
public MongoFacade mongoFacade()

让我知道它是否适合你。