Mybatis plus异常: type `java.time.LocalDateTime` not supported by default

发布于:2025-03-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

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