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);
}