Spring Data MongoDB 4.0中MongoManagedTypes是什么及如何配置?
问题背景
在Spring Data MongoDB 3.2版本中,自定义继承AbstractReactiveMongoConfiguration的MyMongoConfig类时,实现的mongoMappingContext方法如下:
@Override public MongoMappingContext mongoMappingContext(MongoCustomConversions customConversions) throws ClassNotFoundException { return super.mongoMappingContext(customConversions); }
升级到4.0版本后,该方法签名变更为必须传入MongoManagedTypes参数:
@Override public MongoMappingContext mongoMappingContext(MongoCustomConversions customConversions, MongoManagedTypes types) { return super.mongoMappingContext(customConversions(), types); }
修改后出现初始化错误:types集合长度为0,且触发循环依赖报错:
Factory method 'mongoMappingContext' threw exception with message: Error creating bean with name 'customConversions' defined in class path resource factory bean 'MyMongoConfig'; factory method 'customConversions()'. Check that a method with the specified name exists and that it is non-static.
注:customConversions()方法在3.2版本中可正常使用,该变更为Spring Data MongoDB内部逻辑调整,用于优化实体映射的管理机制。
一、MongoManagedTypes 是什么
MongoManagedTypes是Spring Data MongoDB 4.0新增的类型管理容器,用于明确指定需要MongoDB映射的实体类集合。它替代了旧版本中隐式扫描实体的逻辑,让实体映射的范围更可控、配置更显式,避免自动扫描可能带来的遗漏或冗余问题。
二、正确配置与解决方法
1. 修复循环依赖问题
当前代码中直接调用customConversions()会触发循环依赖(mongoMappingContext依赖customConversions,而customConversions的初始化可能依赖mongoMappingContext相关组件),应直接使用方法参数传入的customConversions实例:
@Override public MongoMappingContext mongoMappingContext(MongoCustomConversions customConversions, MongoManagedTypes types) { return super.mongoMappingContext(customConversions, types); }
2. 显式配置MongoManagedTypes
如果默认的实体扫描未覆盖你的业务实体(导致types为空),可以重写mongoManagedTypes()方法,指定实体类所在的包路径:
@Bean @Override public MongoManagedTypes mongoManagedTypes() { // 替换为你的实体类所在包,支持多个包路径用逗号分隔 return MongoManagedTypes.fromPackage("com.your.project.entities"); }
该方法来自父类MongoConfigurationSupport,重写后可以精准控制哪些实体类被纳入MongoDB的映射管理。
3. 确保customConversions方法的合法性
确认customConversions()方法是public、非静态的Spring Bean方法,符合定义规范:
@Bean @Override public MongoCustomConversions customConversions() { List<Converter<?, ?>> converters = new ArrayList<>(); // 添加自定义转换器 converters.add(new YourCustomConverter()); return new MongoCustomConversions(converters); }
内容的提问来源于stack exchange,提问作者Endre Moen

