从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
相关产品推荐
相关产品推荐

