Java @Qualifier的问题
我在JavaSpring环境中工作,在让@Qualifier正常工作方面遇到了问题。我们项目的其他部分正在使用@Inject来获取bean,但我需要有同一个bean的两个版本,看起来使用@Autowired和@Qualifier应该可以做到这一点,但我无法让它们工作。我可能错过了一件小事,但没有找到答案 下面是代码的相关部分。我一直在尝试各种各样的东西,所以我可能有比现在需要的更多的注释和参数Java @Qualifier的问题,java,spring,mongodb,Java,Spring,Mongodb,我在JavaSpring环境中工作,在让@Qualifier正常工作方面遇到了问题。我们项目的其他部分正在使用@Inject来获取bean,但我需要有同一个bean的两个版本,看起来使用@Autowired和@Qualifier应该可以做到这一点,但我无法让它们工作。我可能错过了一件小事,但没有找到答案 下面是代码的相关部分。我一直在尝试各种各样的东西,所以我可能有比现在需要的更多的注释和参数 public class MongoDbConfig { @Bean(name="source
public class MongoDbConfig {
@Bean(name="sourceTemplate")
@Qualifier("sourceTemplate")
public MongoTemplate getSourceTemplate() {
MongoTemplate mt = new MongoTemplate(getMongoDbFactory(sourceServers, sourceDatabaseName));
return mt;
}
@Bean(name="destinationTemplate")
@Qualifier("destinationTemplate")
public MongoTemplate getDestinationTemplate() {
MongoTemplate mt = new MongoTemplate(getMongoDbFactory(destinationServers, destinationDatabaseName));
return mt;
}
}
public class SourceDaoImpl implements SourceDao {
@Autowired
@Qualifier("sourceTemplate")
private MongoOperations mongoOps;
}
public class DestinationDaoImpl implements DestinationDao {
@Autowired
@Qualifier("destinationTemplate")
private MongoOperations mongoOps;
}
当我尝试启动我的应用程序时,我得到以下信息:
Parameter 1 of method gridFsTemplate in org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration required a single bean, but 2 were found:
- sourceTemplate: defined by method 'getSourceTemplate' in MongoDbConfig
- destinationTemplate: defined by method 'getDestinationTemplate' in MongoDbConfig
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
感谢您对我在这里遗漏的内容提出建议。试试这个:
public class MongoDbConfig {
@Bean(name = {"sourceTemplate", "mongoTemplate"})
public MongoTemplate getSourceTemplate() {
MongoTemplate mt = new MongoTemplate(getMongoDbFactory(sourceServers, sourceDatabaseName));
return mt;
}
@Bean(name="destinationTemplate")
public MongoTemplate getDestinationTemplate() {
MongoTemplate mt = new MongoTemplate(getMongoDbFactory(destinationServers, destinationDatabaseName));
return mt;
}
}
public class SourceDaoImpl implements SourceDao {
@Autowired
@Qualifier("sourceTemplate")
private MongoOperations mongoOps;
}
public class DestinationDaoImpl implements DestinationDao {
@Autowired
@Qualifier("destinationTemplate")
private MongoOperations mongoOps;
}
更新
实际上,方法是:
@Bean
@ConditionalOnMissingBean
public GridFsTemplate gridFsTemplate(MongoDbFactory mongoDbFactory,
MongoTemplate mongoTemplate) {
return new GridFsTemplate(
new GridFsMongoDbFactory(mongoDbFactory, this.properties),
mongoTemplate.getConverter());
}
在MongoDataAutoConfiguration
中,需要一个名为“MongoTemplate”的MongoTemplate bean,但找不到该bean,相反,您已经定义了自己的另外两个bean“sourceTemplate”和“destinationTemplate”
我想这会解决你的问题 有几种方法可以做到这一点:
public class MongoDbConfig {
@Bean
@Qualifier("sourceTemplate")
public MongoTemplate getSourceTemplate() {
MongoTemplate mt = new MongoTemplate(getMongoDbFactory(sourceServers, sourceDatabaseName));
return mt;
}
....
}
或:
然后
谢谢你的快速回复。应用程序启动了,所以它可能工作正常。但我不明白为什么。如果gridFsTemplate正在寻找“mongoTemplate”,这是否只是两次都回拉sourceTemplate?我还尝试将“mongoTemplate”添加到目标bean中。这也很好。我想我很好,只是不是100%相信春天的魔法。:-)实际上,gridFsTemplate()需要一个MongoTemplate类型的bean,但没有任何@Qualifier(因此spring将尝试查找一个默认名称为“MongoTemplate”的bean),但找不到该bean。因此,您必须定义一个名为“MongoTemplate”的MongoTemplate的单独bean,或者将任何现有bean命名为“MongoTemplate”,如sourceTemplate或destinationTemplate beansAgreed,这样应该可以工作。第二个版本是我在添加更多之前开始使用的版本。但得到的错误信息与上面相同。谢谢你。
public class MongoDbConfig {
@Bean(name ="sourceTemplate")
public MongoTemplate getSourceTemplate() {
MongoTemplate mt = new MongoTemplate(getMongoDbFactory(sourceServers, sourceDatabaseName));
return mt;
}
public class SourceDaoImpl implements SourceDao {
@Autowired
@Qualifier("sourceTemplate")
private MongoOperations mongoOps;
}