Spring Data Mongo 2.0.2升级后遇Invalid JSON Number问题及修复
解决MongoDB升级后@Query查询的JsonParseException问题
快速修复方案
直接在@Query的参数索引前后添加单引号即可解决问题:
修改前的代码:
@Query(value = "{'type': 'Application','name': ?0,'organizationId': ?1}", fields = "{_id:1}")
修改后的代码:
@Query(value = "{'type': 'Application','name': '?0','organizationId': '?1'}", fields = "{_id:1}")
问题背景与排查过程
我最近升级了MongoDB到3.4.10版本,同时把Spring Data MongoDB驱动升级到2.0.2,结果原有MongoRepository中使用@Query的查询方法突然抛出了org.bson.json.JsonParseException: Invalid JSON Number错误。
一开始我怀疑是项目里自定义的Spring MongoConverter出了问题,毕竟这是这个查询对象独有的配置。我的转换器代码如下:
读取转换器
public class ApplicationPolicyReadConverotor implements Converter<Document, ApplicationPolicy > { private MongoConverter mongoConverter; public ApplicationPolicyReadConverotor(MongoConverter mongoConverter) { this.mongoConverter = mongoConverter; } public ApplicationPolicy convert(Document source) { ApplicationPolicyEntity entity = mongoConverter.read(ApplicationPolicyEntity.class, source); ApplicationPolicy policy = new ApplicationPolicy(); addFields(policy, entity); addPackages(policy, entity); return policy; } }
写入转换器
public class ApplicationPolicyWriteConvertor implements Converter<ApplicationPolicy, Document>{ private MongoConverter mongoConverter; public ApplicationPolicyWriteConvertor(MongoConverter mongoConverter) { this.mongoConverter = mongoConverter; } @Override public Document convert(ApplicationPolicy source) { System.out.println("mashuWrite"); ApplicationPolicyEntity target = new ApplicationPolicyEntity(); copyFields(source, target); copyPackages(source, target); Document Doc = new Document(); mongoConverter.write(target, Doc); return Doc; } }
MappingMongoConverter初始化代码
SimpleMongoDbFactory simpleMongoDbFactory = new SimpleMongoDbFactory(client, dbName); DefaultDbRefResolver defaultDbRefResolver = new DefaultDbRefResolver(simpleMongoDbFactory); MongoMappingContext mongoMappingContext = new MongoMappingContext(); MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(defaultDbRefResolver, mongoMappingContext); mappingMongoConverter.setMapKeyDotReplacement("_dot_"); // Adding custom read and write converters for permission policy. mappingMongoConverter.setCustomConversions(new MongoCustomConversions(Arrays.asList( new ApplicationPolicyWriteConvertor(mappingMongoConverter), new ApplicationPolicyReadConverotor( mappingMongoConverter)))); mappingMongoConverter.afterPropertiesSet(); final MongoTemplate template = new MongoTemplate(simpleMongoDbFactory, mappingMongoConverter); return template;
我翻了官方文档确认转换器的实现逻辑是正确的,而且其他没用到自定义映射的对象查询都正常。调试的时候还发现,查询根本没进入转换器的代码块,说明问题不在转换环节。最后抱着试试的心态修改了@Query里参数的引号,没想到直接解决了问题。
内容的提问来源于stack exchange,提问作者seman
相关产品推荐
相关产品推荐

