在 Spring Boot 中,Jackson 出现 LocalDateTime 序列化错误

问题描述 投票:0回答:1

环境:Spring Boot\Mybatis-Plus\Jackson Ime 的实体:

package cn.bukkit.sip.orm.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "img", resultMap = "BaseResultMap")
public class ImgEntity implements Serializable {
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    @TableField(value = "name")
    private String name;

    @TableField(value = "path")
    private String path;

    @TableField(value = "size")
    private Integer size;

    @Builder.Default
    @TableField(value = "public")
    private Boolean isPublic = true;

    @TableField(value = "limit_date")
    private LocalDateTime dateLimit;

    @TableField(value = "limit_times")
    private Integer timesLimit;

    @TableField(value = "owner")
    private String owner;

    @Builder.Default
    @TableLogic
    @TableField(value = "deleted")
    @JsonIgnore
    private Boolean isDeleted = false;

    @JsonIgnore
    @TableField(exist = false)
    final private UserEntity userEntity = null;
}

我配置了对象映射器的bean

    @Bean
    ObjectMapper objectMapper() {
        return JsonMapper.builder()
                .addModule(new JavaTimeModule())
                .build();
    }

但是当我读取记录并读取 json 时,例外:

Could not write JSON: Type id handling not implemented for type java.lang.Object (by serializer of type com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer) (through reference chain: cn.bukkit.sip.orm.entity.ImgEntity[\"dateLimit\"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: **Type id handling not implemented for type java.lang.Object** (by serializer of type com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer) (through reference chain: cn.bukkit.sip.orm.entity.ImgEntity[\"dateLimit\"])

为什么

未针对 java.lang.Object 类型实现类型 id 处理

我想我已经配置了 JavaTimeModule

我可以通过使用启用它

    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8", shape = JsonFormat.Shape.STRING)

但我想在全球范围内进行

我已经尝试过

Jackson2ObjectMapperBuilderCustomizer
什么都没发生!

结果:我发现是redis缓存问题, 代码:

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.registerModules(new JavaTimeModule());

        jackson2JsonRedisSerializer.setObjectMapper(om);

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ZERO)
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        return RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
    }
java json spring jackson
1个回答
0
投票

我通过使用解决了这个问题

SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 

所以,尝试将杰克逊映射器更改为此:

 ObjectMapper mapper = new ObjectMapper();
 mapper.registerModule(new JavaTimeModule());
 mapper.disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
© www.soinside.com 2019 - 2024. All rights reserved.