Spring Boot查询MongoDB嵌入文档遇StackOverflowException问题求助
问题排查与解决方法
可能的原因及对应解决方案
1. 实体类双向循环引用
如果Settlement实体类中存在指向ZipCode的反向引用(比如@DBRef或普通对象引用),即使findAll能正常返回,执行特定查询时Jackson序列化/反序列化过程会触发无限递归,最终导致StackOverflowException。
解决步骤:
- 检查
Settlement类,移除不必要的反向引用(MongoDB嵌入结构不需要双向关联); - 若必须保留引用,在该字段上添加
@JsonIgnore或@JsonBackReference注解,打断序列化循环。
2. 派生查询路径不明确
municipality是嵌入在settlements数组中的字段,默认的getByMunicipality派生查询无法正确识别字段路径,导致Spring Data MongoDB内部解析查询逻辑时出现递归栈溢出。
解决步骤:
- 使用明确的路径派生查询方法名:
List<ZipCode> getBySettlementsMunicipality(String municipality);
- 或者手动用
@Query指定查询条件(更可靠):
@Query("{ 'settlements.municipality' : ?0 }") List<ZipCode> findByMunicipality(String municipality);
3. Spring Data MongoDB版本bug
部分旧版本的Spring Data MongoDB在处理嵌入数组的派生查询时存在递归解析bug,会触发栈溢出。
解决步骤:
- 将Spring Data MongoDB依赖升级到最新稳定版本(需匹配对应Spring Boot版本)。
验证方法
先通过MongoDB Compass手动执行查询db.zipcodes.find({ 'settlements.municipality': '目标城市名' }),确认数据存在且查询正常,再测试Spring Boot中的查询方法,排除数据本身的问题。
内容的提问来源于stack exchange,提问作者Jetto Martínez
相关产品推荐
相关产品推荐

