gpt4 book ai didi

java - 将 MongoTemplate 传递给自定义存储库实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:37 25 4
gpt4 key购买 nike

项目配置为使用多个 MongoTemplate

Mongo Ref 作为

传递
@EnableMongoRepositories(basePackages={"com.mypackage.one"}, mongoTemplateRef="mongoTemplateOne")

用于包 com.mypackage.one 中的存储库

@EnableMongoRepositories(basePackages={"com.mypackage.two"}, mongoTemplateRef="mongoTemplateTwo")

对于包 com.mypackage.two 中的存储库

对于标准存储库,它工作正常。但是对于需要自定义行为的场景,我定义了 myRepoCustomImpl 来满足我的自定义行为需求。

问题:我需要访问类似标准存储库的 MongoTemplate

例如如果 MyRepoMyRepoCustom 接口(interface)扩展为

@Repository
interface MyRepo extends MongoRepository<MyEntity, String>, MyRepoCustom{}

MyRepoCustomImpl

@Service
public class MyRepoCustomImpl implements MyRepoCustom{
@Autowired
@Qualifier("mongoTemplateOne")
MongoTemplate mongoTmpl;

@Override
MyEntity myCustomNeedFunc(String arg){
// MyImplemenation goes here
}

}

如果 MyRepo 在包 com.mypackage.one 中,mongoTemplateOne 将被 myRepo 使用,所以应该有一些方法MyRepoCustomImpl 将知道它也应该使用 mongoTemplateOne,每当我将在 mongoTemplateRef 中为 MyRepo 进行更改时,比如

@EnableMongoRepositories(basePackages={"com.mypackage.one"}, mongoTemplateRef="mongoTemplateThree")

现在我需要更改 MyRepoCustomImpl 中的@Qualifier!有很多具有自定义行为的 repo 协议(protocol),因此它变得很乏味。

问题:是否有任何方法可以根据它扩展到的 Repo 自动注入(inject)或解析要使用的 MongoTemplate?

最佳答案

MongoTemplate 未通过 MongoRepository 接口(interface)公开。他们可能会公开 MongoTemplate @Bean 的名称,这可能会为您的问题提供解决方案。但是,鉴于他们没有这样做,我将在下面提供一个可能适合您需要的示例。

首先 mongoTemplateRef 引用要使用的 @Beanname,它没有指定 的名称MongoTemplate.

您需要提供每个 MongoTemplate @Bean,然后在您的 @EnableMongoRepositories 注释中引用它。

由于您使用的是 spring-boot,因此您可以利用 MongoDataAutoConfiguration 类。请在这里查看它的作用 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.java .

最简单的例子就是这个。

package: com.xyz.repo(这个实现依赖于MongoDataAutoConfiguration提供的配置)

@Configuration
@EnableMongoRepositories(basePackages={"com.xyz.repo"}) //mongoTemplateRef defaults to mongoTemplate
public class XyzRepoConfiguration {

}

public abstract class BaseRepo {
@Autowired
MongoTemplate mongoTemplate;
}

@Service
public class MyRepoCustomImpl extends BaseRepo implements MyRepoCustom {
@Override
MyEntity myCustomNeedFunc(String arg){
// access to this.mongoTemplate is present
}
}

包: com.abc.repo

@Configuration
@EnableMongoRepositories(basePackages={"com.abc.repo"}, mongoTemplateRef=AbcRepConfiguration.TEMPLATE_NAME)
public class AbcRepoConfiguration {
public static final String TEMPLATE_NAME = "mongoTemplateTwo";

@Bean(name="mongoPropertiesTwo")
@ConfigurationProperties(prefix="spring.data.mongodb2")
public MongoProperties mongoProperties() {
return new MongoProperties();
}

@Bean(name="mongoDbFactoryTwo")
public SimpleMongoDbFactory mongoDbFactory(MongoClient mongo, @Qualifier("mongoPropertiesTwo") MongoProperties mongoProperties) throws Exception {
String database = this.mongoProperties.getMongoClientDatabase();
return new SimpleMongoDbFactory(mongo, database);
}

@Bean(name=AbcRepoConfiguration.TEMPLATE_NAME)
public MongoTemplate mongoTemplate(@Qualifier("mongoDbFactoryTwo") MongoDbFactory mongoDbFactory, MongoConverter converter) throws UnknownHostException {
return new MongoTemplate(mongoDbFactory, converter);
}
}

public abstract class BaseRepo {
@Autowired
@Qualifier(AbcRepoConfiguration.TEMPLATE_NAME)
MongoTemplate mongoTemplate;
}

@Service
public class MyRepoCustomImpl extends BaseRepo implements MyRepoCustom {
@Override
MyEntity myCustomNeedFunc(String arg){
// access to this.mongoTemplate is present
}
}

com.xyz.repo 将依赖 application.properties 中的 spring.data.mongodb 属性com.abc.repo 将依赖 application.properties

中的 spring.data.mongodb2 属性

我以前没有使用过 AbcRepoConfiguration.TEMPLATE_NAME 方法,但它是在我的 IDE 中编译的。

如果您需要任何说明,请告诉我。

关于java - 将 MongoTemplate 传递给自定义存储库实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com