java - 如何在 Jackson2JsonRedisSerializer 中反序列化 java.time.Instant

标签 java spring-boot jackson deserialization json-deserialization

我正在使用 Jackson2JsonRedisSerializer。

@Bean
    public RedisOperations<String , Aircraft> redisOperations(RedisConnectionFactory factory){
        Jackson2JsonRedisSerializer<Aircraft> serializer = new Jackson2JsonRedisSerializer<Aircraft>(Aircraft.class);
        RedisTemplate<String, Aircraft> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setDefaultSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        return template;
    }

我的飞机有 Instant 类型的字段。

    @JsonProperty("last_seen_time")
    private Instant lastSeenTime;

反序列化时出现错误:

Java 8 date/time type `java.time.Instant` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.example.chapter6.sburredis.Aircraft["last_seen_time"])

我已经在我的 pom.xml 中添加了 Maven 依赖项

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.14.1</version>
</dependency>

json文件如下:

{
  "aircraft": [
    {
      "id": 108,
      "callsign": "AMF4263",
      "squawk": "4136",
      "reg": "N49UC",
      "flightno": "",
      "route": "LAN-DFW",
      "type": "B190",
      "category": "A1",
      "altitude": 20000,
      "heading": 235,
      "speed": 248,
      "lat": 38.865905,
      "lon": -90.429382,
      "barometer": 0,
      "vert_rate": 0,
      "selected_altitude": 0,
      "polar_distance": 12.99378,
      "polar_bearing": 345.393951,
      "is_adsb": true,
      "is_on_ground": false,
      "last_seen_time": 1672576769,
      "pos_update_time": 1672576769,
      "bds40_seen_time": null
      }
  ]
}

最佳答案

当我们序列化 Java 对象或将 JSON 反序列化为 POJO 时,会发生此错误。 POJO 包含新的 Java 8+ 日期时间类,例如 LocalDate、LocalTime、LocalDateTime 等。
步骤:

  1. 添加依赖项
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
  • 使用 ObjectMapper 或 JsonMapper 注册模块 JavaTimeModule
  • ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    
    // If JsonMapper is used in application
    JsonMapper jsonMapper = new JsonMapper();
    jsonMapper.registerModule(new JavaTimeModule());
    

    这里您在 bean 中使用了 Jackson2JsonRedisSerializer。因此,您可以创建 ObjectMapper 对象并设置 JavaTimeModule。之后将 ObjectMapper 注册到 Jackson2JsonRedisSerializer 对象。

    
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    

    关于java - 如何在 Jackson2JsonRedisSerializer 中反序列化 java.time.Instant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74974924/

    相关文章:

    java - 单向同步: how to block on one particular method?

    java - 在 spring boot 中从依赖项目访问父级的 application.properties

    java - 将 List<Object[]> 转换为 JSON

    java - 使用 java 和 JSON 生成一组空的 Json 大括号

    java - Dropwizard 将自定义异常反序列化为 JSON?

    java - 如何禁用 MapStruct 中源映射中的字段?

    java - 如何更正哈希函数?

    javascript - 服务器发送的事件在 Chrome 中不起作用

    java - 如何在 Spring Boot 中仅记录错误

    Spring - 不是托管类型 : class