首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季启动带有LocalDateTime序列化错误的Jackson

春季启动带有LocalDateTime序列化错误的Jackson
EN

Stack Overflow用户
提问于 2022-09-18 12:26:34
回答 1查看 345关注 0票数 0

Env:Spring Boot\Mybatis\Jackson-Ime的实体:

代码语言:javascript
复制
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。

代码语言:javascript
复制
    @Bean
    ObjectMapper objectMapper() {
        return JsonMapper.builder()
                .addModule(new JavaTimeModule())
                .build();
    }

但当我读了唱片,说出了这段话时,例外情况是:

代码语言:javascript
复制
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\"])

为什么

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

我想我已经配置了JavaTimeModule

我可以通过使用启用它

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

但我想在全球范围内

我已经试过Jackson2ObjectMapperBuilderCustomizer

什么都没发生!

结果:我发现这是红宝石缓存问题,

守则:

代码语言:javascript
复制
    @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();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-19 05:51:58

我通过以下方法解决这个问题

代码语言:javascript
复制
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 

所以,试着把你的杰克逊地图改成:

代码语言:javascript
复制
 ObjectMapper mapper = new ObjectMapper();
 mapper.registerModule(new JavaTimeModule());
 mapper.disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73762782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档