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

