Spring Boot 2.0.1集成MongoDB查询嵌套字段遇JSON解析异常求助
解决Spring Boot MongoDB @Query引发的JsonParseException问题
嘿,这个问题我太熟了!你遇到的JsonParseException完全是因为@Query注解里的JSON格式不合法导致的。
你看,MongoDB的查询文档要求所有键必须用双引号包裹,而你写的{address.city:?0}里的address.city没有加引号,这不符合JSON的语法规范——Spring Data MongoDB在解析这个查询条件的时候,会把它当作JSON来处理,碰到没引号的键自然就报错了。
修正方案1:给JSON键加上双引号(转义写法)
把你的@Query注解改成下面这样,注意用转义的双引号包裹嵌套字段名:
@Query(value = "{\"address.city\": ?0}") public List<Hotel> findByCity(String city); @Query(value = "{\"address.country\": ?0}") public List<Hotel> findByCountry(String country);
修正方案2:用单引号包裹整个JSON(更易读)
如果你觉得转义双引号看着麻烦,也可以用单引号把整个JSON字符串包起来,内部直接用双引号,这样不用转义:
@Query(value = '{"address.city": ?0}') public List<Hotel> findByCity(String city); @Query(value = '{"address.country": ?0}') public List<Hotel> findByCountry(String country);
额外小技巧:用方法名推导替代@Query
其实Spring Data MongoDB支持方法名自动推导查询,你甚至不用写@Query,直接定义方法就行:
public List<Hotel> findByAddressCity(String city); public List<Hotel> findByAddressCountry(String country);
Spring会自动识别AddressCity对应文档里的address.city嵌套字段,生成正确的查询,这样既简洁又能避免手动写JSON出错的问题。
改完之后再访问localhost:8090/hotels/address/city/Rome,应该就能正常返回数据啦!
内容的提问来源于stack exchange,提问作者Pritam Bohra
相关产品推荐
相关产品推荐

