如何通过 Jackson 使用 json 轻松地在 Redis 中缓存 Kotlin 对象?

Awe*_*own 3 kotlin spring-data-redis spring-boot jackson2

我有一个用 Kotlin 编写的 Spring 启动应用程序,我想在 Redis 中启用缓存。我希望将对象存储为序列化的 JSON,理想情况下不想注册可能被缓存的每种类型。我有一些最有效的配置,但有一个很大的警告。

@Bean
fun redisCacheConfiguration(): RedisCacheConfiguration {
    val objectMapper =
        ObjectMapper()
            .registerModule(KotlinModule())
            .registerModule(JavaTimeModule())
            .enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY)

    val serializer = GenericJackson2JsonRedisSerializer(objectMapper)

    return RedisCacheConfiguration
        .defaultCacheConfig()
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))
}
Run Code Online (Sandbox Code Playgroud)

我在理解 的不同值时遇到了一些麻烦,DefaultTypingNON_FINAL似乎是最广泛的。但是,由于 Kotlin 中的对象默认是 final 的,这仅适用于标记为“open”的对象。理想情况下,我想避免“打开”对象只是为了缓存它们。

有没有其他方法可以让我完成这项工作?

MrK*_*yaz 7

我有同样的问题。您应该使用“开放”类。但这不会帮助您处理数据类,因为您无法使它们“打开”。
有一个名为“all-open”的插件,您可以在其中定义注释。如果使用这些注解类变得“开放”,即使是数据类。

spring-kotlin 插件在底层使用了“全开放”插件,所以像@Service、@Component 等 spring 注释使类对 AOP 开放,因为代理要求您从类继承。

如果你使用 spring-kotlin 插件,有一个很好的注释可以解决你的问题,它用在 Spring Cache 中,它的名字是 @Cacheable。如果您在类上使用 @Cacheable,当您包含以下代码时,它们将变为打开状态并将其类型信息保存到 json(例如:{@class: "com.example.MyClass", ...}):

    val objectMapper =
    ObjectMapper()
        .registerModule(KotlinModule())
        .registerModule(JavaTimeModule())
        .enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY)

val serializer = GenericJackson2JsonRedisSerializer(objectMapper)
Run Code Online (Sandbox Code Playgroud)

更多详情:https : //kotlinlang.org/docs/reference/compiler-plugins.html

简短地说:除了向所需的类添加 @Cacheable 注释外,您无需执行任何操作,而且它也符合 IMO。