有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

项目配置为使用多个MongoTemplates

Mongo Ref被传递为

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

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

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

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

对于标准存储库,它可以正常工作。但对于需要自定义行为的场景,我用自定义行为需求定义saymyrepocustompl

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

例如。 如果MyRepoMyRepoCustom接口扩展为

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

}

如果MyRepocom.mypackage.one包中,那么mongoTemplateOne将由MyRepo使用,因此应该有一种方法来实现MyreposCustomImpl,当我更改MyRepomongoTemplateRef时,它也应该使用mongoTemplateOne,比如

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

现在我需要在^{中对@Qualifier进行更改! 有很多回购协议都带有定制行为,因此这项任务变得单调乏味

问题:相反,是否有任何方法可以根据MongoTemplate扩展到的回购协议自动注入或解决要使用的MongoTemplate


共 (1) 个答案

  1. # 1 楼答案

    MongoTemplate未被MongoRepository接口公开。它们可能会公开MongoTemplate{}的名称,这可能会为您的问题提供解决方案。然而,鉴于事实并非如此,我将在下面提供一个可能适合您需求的示例

    First off mongoTemplateRef指要使用的@Bean名称,它不指定MongoTemplate的名称

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

    因为您使用的是spring boot,所以可以利用MongoDataAutoConfiguration类。请看一下它在这里的作用

    最简单的例子就是这样

    软件包: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。回购协议

    @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。回购协议将依赖于application.properties内的spring.data.mongodb资产 com。abc。回购协议将依赖于application.properties内的spring.data.mongodb2资产

    我还没用过AbcRepoConfiguration。以前的模板命名方法,但它是在我的IDE中编译的

    如果你需要任何澄清,请告诉我