简体   繁体   中英

multiple spring boot mongo connectors SpelEvaluationException error

I'm get this error while setting up a spring boot connecting to multiple mongo database (so custom mongoTemplate config). I'm using SpelExpression in document to dynamically determine collection name at runtime.

org.springframework.expression.spel.SpelEvaluationException: EL1057E: No bean resolver registered in the context to resolve access to bean 'prefixSupplier'

Here's my config:

@SpringBootApplication(exclude = {
        MongoReactiveAutoConfiguration.class,
        MongoReactiveDataAutoConfiguration.class})
public class MyApp {...}

@Configuration
public class MultipleMongoConfiguration {

    @Primary
    @Bean(name = "db1Properties")
    @ConfigurationProperties(prefix = "mongodb.db1")
    public MongoProperties getDb1Props() {
        return new MongoProperties();
    }

    @Bean(name = "db2Properties")
    @ConfigurationProperties(prefix = "mongodb.db2")
    public MongoProperties getDb2Props() {
        return new MongoProperties();
    }


    @Primary
    @Bean
    public ReactiveMongoDatabaseFactory db1MongoDatabaseFactory(@Qualifier("db1Properties") MongoProperties mongo) {
        return new SimpleReactiveMongoDatabaseFactory(
                MongoClients.create(mongo.getUri()), mongo.getDatabase()
        );
    }

    @Bean
    public ReactiveMongoDatabaseFactory db2MongoDatabaseFactory(@Qualifier("db2Properties") MongoProperties mongo) {
        return new SimpleReactiveMongoDatabaseFactory(
                MongoClients.create(mongo.getUri()), mongo.getDatabase()
        );
    }

    @Primary
    @Bean(name = "db1MongoTemplate")
    public ReactiveMongoTemplate db1MongoTemplate() {
        return new ReactiveMongoTemplate(db1MongoDatabaseFactory(getDb1Props()));
    }

    @Bean(name ="db2MongoTemplate")
    public ReactiveMongoTemplate db2MongoTemplate() {
        return new ReactiveMongoTemplate(db2MongoDatabaseFactory(getDb2Props()));
    }
}

@Configuration
@EnableReactiveMongoRepositories(basePackages = {
        "com.demo.database.repository.db1",
        "com.demo.entity.db1"
}, reactiveMongoTemplateRef = "db1MongoTemplate")
public class Db1Configuration {
}

@Value
@Builder
@AllArgsConstructor(access = PRIVATE)
@Document(collection = "#{@prefixSupplier.get().getIdInLowerCase()}_collection")
public class Entity1 {...}

Any idea what i'm missing?

thanks

Was able to fix the issue adding this config:

@Primary
@Bean(name = "productdbMongoTemplate")
public MongoTemplate productdbMongoTemplate(ApplicationContext appContext, MongoCustomConversions customConversions) {
    MongoDatabaseFactory dbFactory = productdbMongoDatabaseFactory(getProductDbProps());

    MongoTemplate mongoTemplate = new MongoTemplate(dbFactory);
    MongoMappingContext mappingContext = (MongoMappingContext) mongoTemplate.getConverter().getMappingContext();
    mappingContext.setApplicationContext(appContext);

    MappingMongoConverter mmc = (MappingMongoConverter)mongoTemplate.getConverter();
    mmc.setCustomConversions(customConversions);
    mmc.afterPropertiesSet();

    return mongoTemplate;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM