Spring Data Elasticsearch版本升级后@Query转义字符异常问题
异常原因
升级到Spring Data Elasticsearch 4.x(对应Spring Boot 2.2.14)后,框架对@Query注解中参数的JSON解析逻辑变得更严格。旧版本中,手动拼接的带转义引号的字符串能被框架兼容处理,但新版本会将参数中的转义反斜杠(\)直接保留到最终生成的JSON查询语句中,导致JSON格式非法——比如你传入的querylink包含转义后的引号\",最终生成的JSON里会出现多余的转义符,触发JSON解析器报错。
解决方案1:改用原生查询构建器(推荐)
放弃手动拼接JSON字符串,使用Spring Data Elasticsearch提供的NativeSearchQueryBuilder构建查询,彻底规避转义问题:
Service层代码修改
// 直接传入原始link数组,无需手动拼接字符串 NativeSearchQuery query = new NativeSearchQueryBuilder() .withFilter(QueryBuilders.termsQuery("linkname", link)) .withPageable(PageRequest.of(page-1, pageSize)) .build(); Page<Testtables> res = elasticsearchRepo.search(query);
Repository层修改
无需自定义getMethod,直接继承ElasticsearchRepository即可使用自带的search方法:
public interface ElasticsearchRepo extends ElasticsearchRepository<Testtables, String> { }
解决方案2:修复@Query的参数传递方式
如果坚持使用@Query,不要手动拼接JSON数组,直接传入字符串列表,让框架自动处理JSON序列化:
Repository层修改
@Query("{\"bool\":{\"filter\":[{\"terms\":{\"linkname\":?0}}]}}") Page<Testtables> getMethod(List<String> linkList, Pageable pageable);
Service层代码修改
直接传入原始的link列表,无需任何字符串拼接操作:
res = elasticsearchRepo.getMethod(link, PageRequest.of(page-1, pageSize));
旧版本兼容说明
Spring Data Elasticsearch 3.x(对应旧版Spring Boot)对@Query参数的处理较为宽松,会自动处理参数中的转义字符,允许手动拼接的JSON字符串直接嵌入查询。但新版本为适配Elasticsearch 7.x的规范,严格遵循JSON格式要求,不再支持这种不规范的参数传递方式。
内容的提问来源于stack exchange,提问作者mpsimham
相关产品推荐
相关产品推荐

