Spring Boot多MongoDB配置下SpelEvaluationException异常求助
问题原因
你遇到的EL1057E: No bean resolver registered错误,是因为自定义ReactiveMongoTemplate时,对应的MongoMappingContext没有注册Spring容器的Bean解析器,导致SpEL表达式无法解析@prefixSupplier这个容器中的bean。
解决步骤
需要手动为每个自定义的ReactiveMongoTemplate配置带有Bean解析器的MongoMappingContext,具体修改如下:
1. 在MultipleMongoConfiguration中添加MongoMappingContext配置
为每个数据库实例创建对应的MongoMappingContext,并注入Spring的BeanFactory来设置Bean解析器:
@Configuration public class MultipleMongoConfiguration { // 保留原有的db1Properties、db2Properties、数据库工厂配置... // 为db1配置MongoMappingContext @Primary @Bean(name = "db1MongoMappingContext") public MongoMappingContext db1MongoMappingContext(BeanFactory beanFactory) { MongoMappingContext mappingContext = new MongoMappingContext(); // 注册Bean解析器,让SpEL能访问容器中的bean mappingContext.setBeanResolver(new BeanFactoryResolver(beanFactory)); return mappingContext; } // 为db2配置MongoMappingContext @Bean(name = "db2MongoMappingContext") public MongoMappingContext db2MongoMappingContext(BeanFactory beanFactory) { MongoMappingContext mappingContext = new MongoMappingContext(); mappingContext.setBeanResolver(new BeanFactoryResolver(beanFactory)); return mappingContext; } // 修改db1MongoTemplate的创建,注入对应的MappingContext @Primary @Bean(name = "db1MongoTemplate") public ReactiveMongoTemplate db1MongoTemplate( @Qualifier("db1MongoDatabaseFactory") ReactiveMongoDatabaseFactory db1MongoDatabaseFactory, @Qualifier("db1MongoMappingContext") MongoMappingContext db1MongoMappingContext) { return new ReactiveMongoTemplate(db1MongoDatabaseFactory, db1MongoMappingContext); } // 修改db2MongoTemplate的创建,注入对应的MappingContext @Bean(name = "db2MongoTemplate") public ReactiveMongoTemplate db2MongoTemplate( @Qualifier("db2MongoDatabaseFactory") ReactiveMongoDatabaseFactory db2MongoDatabaseFactory, @Qualifier("db2MongoMappingContext") MongoMappingContext db2MongoMappingContext) { return new ReactiveMongoTemplate(db2MongoDatabaseFactory, db2MongoMappingContext); } }
2. 确认prefixSupplier是Spring管理的Bean
确保prefixSupplier类上添加了@Component注解,或者通过@Bean方法在配置类中注册,比如:
@Component public class PrefixSupplier { public String getIdInLowerCase() { // 你的业务逻辑 return "prefix"; } }
补充说明
当你排除了自动配置类MongoReactiveDataAutoConfiguration后,Spring不会自动配置带有Bean解析器的MongoMappingContext,所以必须手动设置,让SpEL表达式能够解析容器中的bean引用。
内容的提问来源于stack exchange,提问作者IKane
相关产品推荐
相关产品推荐

