1、问题:
Java数据库实体对象有字段如下:
@TableField(typeHandler = JacksonTypeHandler.class)
private Map<String, Object> dataDetail;
如果dataDetail中有LocalDateTime对象,在保存时会报如下异常:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: java.util.HashMap["updateAt"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1312)
at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:808)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:764)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:479)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:318)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4719)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3964)
at com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.toJson(JacksonTypeHandler.java:66)
2、原因
fastxml默认不支持LocalDateTime对象映射
3、方案
在程序启动时(例如可以在某个用@Configuration标记的类里)设置JacksonTypeHandler的ObjectMapper:
static {
ObjectMapper objectMapper = new ObjectMapper()
.registerModule(new JavaTimeModule());
JacksonTypeHandler.setObjectMapper(objectMapper);
}