为使用noCursorTimeout迁移spring-data-mongodb至1.10.0部署失败
你在升级Spring Data Mongo版本以使用Query.noCursorTimeout()时遇到的Bean创建依赖问题,我帮你拆解下可能的原因和解决步骤:
核心问题定位
错误提示明确指向MongoPropertiesConfiguration无法解析对mongoTemplateReplicaSet的引用,这通常和升级后配置不兼容、依赖缺失或者Bean定义错误有关。
分步解决方案
1. 检查mongoTemplateReplicaSet的Bean定义适配性
Spring Data Mongo 1.10.x版本开始全面切换到MongoDB Java Driver 3.x的MongoClient(替代了旧版的Mongo类),如果你的旧配置里mongoTemplateReplicaSet还是依赖Mongo实例,就会出现问题。
修正配置示例(XML):
<!-- 替换旧的Mongo bean为MongoClient --> <bean id="mongoClient" class="com.mongodb.MongoClient"> <constructor-arg value="你的MongoDB地址"/> <!-- 如果是副本集,这里可以传入多个地址的列表 --> </bean> <!-- 更新mongoTemplateReplicaSet的依赖为mongoClient --> <bean id="mongoTemplateReplicaSet" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongoClient"/> <constructor-arg value="你的数据库名称"/> </bean>
2. 验证MongoPropertiesConfiguration的构造参数引用
确保properties-context.xml中MongoPropertiesConfiguration的构造参数引用的bean id和mongoTemplateReplicaSet完全一致,没有拼写错误:
<bean id="com.example.util.properties.MongoPropertiesConfiguration#7dc57a65" class="com.example.util.properties.MongoPropertiesConfiguration"> <constructor-arg ref="mongoTemplateReplicaSet"/> <!-- 这里的ref必须和目标bean的id完全匹配 --> </bean>
3. 确认MongoDB驱动版本兼容性
Spring Data Mongo 1.10.0对应的MongoDB Java Driver版本是3.2.x,如果你的项目里驱动版本过低,会导致API不兼容,进而引发Bean创建失败。
Maven依赖示例(确保版本匹配):
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.10.0.RELEASE</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.2.2</version> </dependency>
4. 确认noCursorTimeout()的使用方式
虽然当前错误是Bean问题,但提前确认API使用正确性也很重要,1.10.0中该方法的正确用法是:
Query query = new Query(Criteria.where("yourField").is("yourValue")); query.noCursorTimeout(); // 启用无游标超时 List<YourEntity> results = mongoTemplateReplicaSet.find(query, YourEntity.class);
总结
优先从Bean配置的兼容性入手,替换旧的Mongo为MongoClient,确保依赖引用正确,再验证驱动版本匹配,这几个点是升级Spring Data Mongo时最容易踩的坑。
内容的提问来源于stack exchange,提问作者Daniel Aguirre

