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

Spring Data ElasticSearch v4.2.x JSON日期格式转换触发空指针异常

问题根因

空指针异常的核心触发原因是@Field注解的字段类型配置错误:日期类型字段被错误指定为FieldType.Keyword,Spring Data ElasticSearch 4.2.x版本反序列化时会优先读取@Field注解的类型配置执行字段转换,Keyword类型对应的解析逻辑无法处理日期格式字符串,强转日期类型时触发空指针。

同时你配置的format = DateFormat.basic_date_time和自定义的pattern = "yyyy-MM-dd HH:mm:ss"不匹配,也是触发转换异常的潜在原因。

修复方案

  • 修正@Field注解的核心配置,将type改为FieldType.Date,format改为DateFormat.custom适配自定义日期格式,修改后的字段注解如下:
@Field(type = FieldType.Date, name = "created_at", format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createdAt;
  • 如果ElasticSearch中created_at字段本身是按字符串类型存储、未做日期类型映射,可补充自定义日期反序列化器处理字符串转Date逻辑,避免类型不匹配问题:
// 自定义反序列化器
public class CustomDateDeserializer extends StdDeserializer<Date> {
    private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public CustomDateDeserializer() {
        super(Date.class);
    }

    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String dateStr = jsonParser.getText();
        try {
            return formatter.parse(dateStr);
        } catch (ParseException e) {
            // 按需补充异常处理逻辑,例如返回null或者抛出业务异常
            return null;
        }
    }
}

// 字段上新增反序列化注解
@Field(type = FieldType.Date, name = "created_at", format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date createdAt;

注意事项

  • Spring Data ElasticSearch 4.2.x版本对日期字段的解析优先级为:@Field注解配置 > Jackson的@JsonFormat配置,必须保证@Field的类型、格式配置和ES中实际存储的字段格式完全匹配,否则都会触发转换异常。
  • 如果项目配置了Jackson全局日期序列化/反序列化规则,需要保证全局配置的时区、格式和字段单独配置的参数一致,避免规则冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:27:03