如何使用 redis 序列化 Java Instant 类型



我正在使用 Spring boot 2.0.3 和 弹簧-引导-启动器-数据-redis. 也使用 jackson-datatype-jsr310。

我想将对象存储到 redis 中。

对象(MyObj(:

String text;
Instant instant;

这是我的代码:

@Test
public void test() {
ListOperations<String, MyObj> listOps = redisTemplate.opsForList();
MyObj o1 = new MyObj();
o1.setText("foo");
o1.setInstant(Instant.now());
listOps.leftPush("foo", o1);
MyObj o2 = new MyObj();
o2.setText("bar");
o2.setInstant(Instant.now());
listOps.leftPush("foo", o2);
List<MyObj> list = listOps.range("foo", 0, -1);
for (MyObj o : list) {
System.out.println(o.getText());
System.out.println(o.getInstant());
}
}

在我的 RedisConfig 中:

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

但是当我推入 redis 时,错误发生在下面:

org.springframework.data.redis.serializer.SerializationException:无法读取 JSON:无法构造java.time.Instant的实例(不存在创建者,如默认构造(:无法从对象值反序列化(没有基于委托或属性的创建者(

如何使用 Redis 序列化 java 即时类型?

任何意见将不胜感激。

虽然这是一个相当古老的帖子,但我最近遇到了这个问题,做了懒人搜索并在决定阅读类文件之前找到了这个。我发现您可以使用自定义ObjectMapper轻松覆盖默认。使用序列化程序上的setObjectMapper(ObjectMapper objectMapper)方法重写默认值。

// Taken from Jackson library
public class Jackson2JsonRedisSerializer<T> implements RedisSerializer<T> {
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private final JavaType javaType;
private ObjectMapper objectMapper = new ObjectMapper();

// truncated

public void setObjectMapper(ObjectMapper objectMapper) {
Assert.notNull(objectMapper, "'objectMapper' must not be null");
this.objectMapper = objectMapper;
}

你只需要创建一个注册的JavaTime.Module的ObjectMapper,如下所示

public static ObjectMapper dateMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
Jackson2JsonRedisSerializer<MyObj> valueSerializer = new 
Jackson2JsonRedisSerializer<>(MyObj.class);
valueSerializer.setObjectMapper(dateMapper());
}

disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)默认行为的轮次。

相关内容

  • 没有找到相关文章

最新更新