我正在使用 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 等。
步骤:
- 添加依赖项
<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/