gpt4 book ai didi

java - Redisson(通过 JCache API)仅反序列化为 String

转载 作者:行者123 更新时间:2023-11-30 06:19:51 33 4
gpt4 key购买 nike

我有一个Redisson客户端来存储一对字符串,LocalDateTime。它配置为通过 JCache API (JSR-107) 使用。

存储完成,使用 Jackson 转换为诸如 2018-01-23T11:59:34.997834 之类的值,但检索时不使用任何转换器并返回字符串,在 cache#get 调用。

我在这里缺少什么?

@Test
public void getCacheInline() {
Config redissonCfg = new Config();
redissonCfg
.setCodec(new JsonJacksonCodec(buildObjectMapper()))
.useSingleServer()
.setAddress("redis://redis:6379");

MutableConfiguration<String, LocalDateTime> jcacheConfig = new MutableConfiguration<String, LocalDateTime>()
.setTypes(String.class, LocalDateTime.class)
.setExpiryPolicyFactory((Factory<ExpiryPolicy>) () -> new CreatedExpiryPolicy(new Duration(SECONDS, 100)));

Configuration<String, LocalDateTime> configuration = RedissonConfiguration.fromConfig(redissonCfg, jcacheConfig);


Cache<String, LocalDateTime> cache = cacheManager.createCache(CACHE_NAME, configuration);
LocalDateTime expectedDateTime = LocalDateTime.now();
cache.put("testKey", expectedDateTime);

// In this line: java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.time.LocalDateTime
LocalDateTime actualDateTime = cache.get("testKey");
assertThat(actualDateTime, is(equalTo(expectedDateTime)));
}

private ObjectMapper buildObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
objectMapper.setSerializationInclusion(NON_NULL);
return objectMapper;
}

最佳答案

最初的解决方法是不存储一对 String, LocalDateTime ,将 LocalDateTime 包装在包装类中:

public class LocalDateTimeWrapper {
private LocalDateTime value;
...
}

这将使 Jackson 使用 @class 序列化 json 字符串。属性指示 LocalDateTimeWrapper 类,并且可以从那里检索 LocalDateTime 作为反序列化字符串的类型,如 2018-01-23T11:59:34.997834到。

我尝试过并为我工作的更好的解决方案是 GitHub 问题 https://github.com/redisson/redisson/issues/1260#issuecomment-367272400 中建议的解决方案像这样扩展 JsonJacksonMapCodec:

public static class ExtendedJsonJacksonMapCodec extends JsonJacksonMapCodec {

public ExtendedJsonJacksonMapCodec() {
super(String.class, LocalDateTime.class);
}

@Override
protected void init(ObjectMapper objectMapper) {
objectMapper.registerModule(new JavaTimeModule());
super.init(objectMapper);
}

}

然后像这样从配置链接它(YAML 格式):

singleServerConfig:
address: "redis://localhost:6379"
codec: !<com.example.ExtendedJsonJacksonMapCodec> {}

关于java - Redisson(通过 JCache API)仅反序列化为 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48400240/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com