Java @Qualifier的问题

Java @Qualifier的问题,java,spring,mongodb,Java,Spring,Mongodb,我在JavaSpring环境中工作,在让@Qualifier正常工作方面遇到了问题。我们项目的其他部分正在使用@Inject来获取bean,但我需要有同一个bean的两个版本,看起来使用@Autowired和@Qualifier应该可以做到这一点,但我无法让它们工作。我可能错过了一件小事,但没有找到答案 下面是代码的相关部分。我一直在尝试各种各样的东西,所以我可能有比现在需要的更多的注释和参数 public class MongoDbConfig { @Bean(name="source

我在JavaSpring环境中工作,在让@Qualifier正常工作方面遇到了问题。我们项目的其他部分正在使用@Inject来获取bean,但我需要有同一个bean的两个版本,看起来使用@Autowired和@Qualifier应该可以做到这一点,但我无法让它们工作。我可能错过了一件小事,但没有找到答案

下面是代码的相关部分。我一直在尝试各种各样的东西,所以我可能有比现在需要的更多的注释和参数

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