如何恢复Elasticsearch 8 Java客户端SearchResponse的旧行为?
解决Elasticsearch 8 Java客户端返回Map<String, Any>的问题
核心问题原因
你之前的代码错误在于传递了匿名TypeReference的Class对象给search方法,Jackson无法识别泛型类型,误将响应反序列化为该匿名内部类的实例(而非Map),因此出现未识别字段的报错。
解决方案
1. 正确使用TypeReference
直接传递TypeReference实例给search方法,让Jackson正确识别泛型类型:
val searchResponse = elasticsearchClient.search( searchRequest, object : TypeReference<Map<String, Any?>>() {} )
2. 配置Jackson忽略未知属性
如果仍存在未识别字段的问题,可自定义Jackson的ObjectMapper,关闭FAIL_ON_UNKNOWN_PROPERTIES特性,确保反序列化时忽略多余字段:
// 配置Jackson val objectMapper = ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .registerModule(KotlinModule()) // 适配Kotlin语法特性 // 基于自定义Mapper创建ES客户端 val jsonpMapper = JacksonJsonpMapper(objectMapper) val restClient = RestClient.builder(HttpHost.create("你的ES服务地址")) .build() val transport = RestClientTransport(restClient, jsonpMapper) val elasticsearchClient = ElasticsearchClient(transport)
完成配置后,再用上述正确的TypeReference方式执行搜索即可。
3. 手动反序列化响应体(备选)
若前两种方法不适用,可先获取JsonNode格式的响应,再手动转换为Map:
val response = elasticsearchClient.search(searchRequest, JsonNode::class.java) val objectMapper = ObjectMapper().registerModule(KotlinModule()) val resultMaps = response.hits().hits().map { hit -> objectMapper.convertValue(hit.source(), object : TypeReference<Map<String, Any?>>() {}) }
内容的提问来源于stack exchange,提问作者Manu Zi
相关产品推荐
相关产品推荐

