You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Elasticsearch查询数据转List报错:sourceAsMap添加失败

问题分析与解决方案

嗨,我一眼就看到你代码里的问题啦!你报错的那行productList.add(product.setName(sourceAsMap.get("name").toString())),问题出在setName方法的返回值上。

你看你的Product类里,setName是void类型的方法——它只负责给name属性赋值,不会返回任何对象。但List.add()方法需要你传入一个Product类型的对象,把void塞进去当然会报错啦!

修正方案1:拆分步骤(基础版)

把设置属性和添加到列表的操作分开,先调用setName赋值,再把product对象加入列表。另外建议加上空值判断,避免sourceAsMap.get("name")为null时触发空指针异常:

SearchHit[] searchHits = searchResponse.getHits().getHits();
List<Product> productList = new ArrayList<>();
for (SearchHit hit : searchHits) {
    // 获取当前hit的源数据Map
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
    Product product = new Product();
    
    // 先设置name属性,做空值判断
    Object nameObj = sourceAsMap.get("name");
    if (nameObj != null) {
        product.setName(nameObj.toString());
    }
    
    // 再把Product对象添加到列表
    productList.add(product);
}
return productList;

修正方案2:用ObjectMapper直接转换(更优雅)

如果你的项目里已经引入了Jackson(Elasticsearch客户端通常会依赖它),可以直接把sourceAsMap转换成Product对象,省去手动赋值的麻烦:

import com.fasterxml.jackson.databind.ObjectMapper;

// ... 其他业务代码
SearchHit[] searchHits = searchResponse.getHits().getHits();
List<Product> productList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper();

for (SearchHit hit : searchHits) {
    // 直接将源数据Map转换为Product对象
    Product product = objectMapper.convertValue(hit.getSourceAsMap(), Product.class);
    productList.add(product);
}
return productList;

这种方式不仅更简洁,还能自动处理大部分类型转换,后续如果Product类添加新属性,也不用手动修改赋值代码,非常省心~

内容的提问来源于stack exchange,提问作者Karthikeyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:12:30