ReactiveMongoRepository中findById/findByUuid查询UUID返回null问题
问题排查与解决方案
核心原因
测试数据导入时的UUID存储格式,和Java代码通过自定义转换器保存的UUID格式不匹配。MongoDB中UUID支持多种存储形式(字符串、不同子类型的Binary),你的自定义转换器仅适配了Java保存场景的格式,导致查询导入数据时无法匹配。
具体排查与修复步骤
检查测试数据的UUID存储格式
进入Testcontainers启动的Mongo容器,用mongoShell查询Solutions集合,查看uuid字段的实际存储类型:db.solutions.findOne({}, {uuid: 1, _id: 1})如果返回的是字符串格式(如
"uuid": "a1b2c3d4-xxxx-xxxx"),或Binary的子类型与你转换器指定的不一致(比如默认UUID_SUBTYPE和你用的OLD_UUID_SUBTYPE),就是问题根源。补全自定义转换器的读取逻辑
确保转换器覆盖从DB到实体的读取场景,适配导入数据的UUID存储格式:@ReadingConverter public class BinaryToUuidConverter implements Converter<Binary, UUID> { @Override public UUID convert(Binary source) { // 匹配导入数据的Binary子类型,比如04对应UUID_SUBTYPE if (source.getType() == 4) { return UUID.nameUUIDFromBytes(source.getData()); } // 若导入的是字符串格式,可额外添加字符串转UUID的转换器 throw new IllegalArgumentException("Unsupported Binary subtype for UUID"); } }如果导入数据是字符串UUID,需新增
StringToUuidConverter并注册。统一测试数据的UUID存储格式
若用JSON文件导入,将UUID字段转为MongoDB标准Binary格式:{ "_id": {"$binary": {"base64": "MTIzNDU2Nzg5MDEyMzQ1Ng==", "subType": "04"}}, "uuid": {"$binary": {"base64": "MTIzNDU2Nzg5MDEyMzQ1Ng==", "subType": "04"}} }或用
mongoimport时,通过--type json并指定UUID字段的解析规则。快速验证方法
在测试代码中打印导入数据的UUID细节,对比查询用的UUID:solutionRepository.findAll().take(1).doOnNext(solution -> { System.out.println("导入数据UUID值: " + solution.getUuid()); System.out.println("导入数据UUID哈希: " + solution.getUuid().hashCode()); System.out.println("查询用UUID哈希: " + targetUuid.hashCode()); }).block();若值相同但哈希不同,说明UUID的存储/解析逻辑存在不一致。
内容的提问来源于stack exchange,提问作者JMaster
相关产品推荐
相关产品推荐

