Spring Boot接口从Elasticsearch取数时空指针异常处理求助
问题分析与解决方案
你遇到的NullPointerException根源很明确:你先调用了toString()再判断是否为null。如果sourceAsMap.get("expiration_date")本身就是null,那么调用toString()的瞬间就会直接抛出空指针异常,根本走不到后面的三元判断逻辑。
修复方案一:先判断null,再调用toString
直接调整三元表达式的顺序,先检查获取到的对象是否为null,再决定是否调用toString:
product.setExpiration_date(sourceAsMap.get("expiration_date") != null ? sourceAsMap.get("expiration_date").toString() : "");
修复方案二:封装工具方法,统一处理所有字段
既然多个字段都可能存在null的情况,不如封装一个通用方法来避免重复代码,同时让代码更整洁:
// 在你的Dao类里添加这个工具方法 private String getSafeString(Map<String, Object> dataMap, String fieldKey) { Object fieldValue = dataMap.get(fieldKey); return fieldValue != null ? fieldValue.toString() : ""; } // 然后在赋值时统一使用这个方法 product.setName(getSafeString(sourceAsMap, "name")); product.setCatalog_id(getSafeString(sourceAsMap, "catalog_id")); product.setCode(getSafeString(sourceAsMap, "code")); product.setExpiration_date(getSafeString(sourceAsMap, "expiration_date")); product.setIs_visible(getSafeString(sourceAsMap, "is_visible"));
修复方案三:用Java 8 Optional实现更优雅的空值处理
如果你使用Java 8及以上版本,Optional是处理空值更优雅的方式:
import java.util.Optional; // 单个字段的处理示例 product.setExpiration_date(Optional.ofNullable(sourceAsMap.get("expiration_date")) .map(Object::toString) .orElse(""));
额外建议:避免重复的手动映射
如果你的Product类字段较多,手动逐个赋值不仅繁琐,还容易遗漏空值处理。可以考虑使用Jackson的ObjectMapper直接将Map转换为POJO,它会自动处理null值(比如将null字符串字段设为null或者空字符串,取决于你的配置):
import com.fasterxml.jackson.databind.ObjectMapper; // 初始化ObjectMapper(可以作为类成员变量复用) ObjectMapper objectMapper = new ObjectMapper(); // 直接将Map转换为Product对象 Product product = objectMapper.convertValue(sourceAsMap, Product.class);
这样一来,所有字段的空值都会被自动处理,不需要手动逐个判断。
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

