我正在使用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
      }
  ]
}

推荐答案

This error occurs when we serialize a Java object or deserialize JSON to POJO. The POJO contains new Java 8+ date time classes such as LocalDate, LocalTime, LocalDateTime etc.
Steps:

  1. 添加依赖项
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
  1. 向对象映射器或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.因此,您可以创建对象映射器对象并设置JavaTimeModule.之后,将对象映射器注册到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相关问答推荐

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

填写文本字段后锁定PDF

为什么我要创建一个单独的互斥体/锁对象?

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

我找不到&Quot;配置&的位置

在处理2个映射表时,没有更多的数据可从套接字读取

垃圾回收器是否真的删除超出作用域的对象?

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

有谁能帮我修一下这个吗?使输出变得更加整洁

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

如何使用jooq更新记录?

JPA无手术同品种器械可能吗?

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

Java递归泛型是否可以被视为继承和重写的语法糖

睡眠在 Spring Boot 中

无法在 main 中创建对象

时间戳的日期时间字符串在 Select 时显示为本地时区而不是 UTC

升级到Spring Boot 3后mapstruct生成的文件中的Javax依赖

JPA - getSingleResult 与 LIMIT 1