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

问题描述 投票:0回答:1

我有一个用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))
}

我在理解DefaultTyping的不同值时遇到了一些麻烦,但NON_FINAL似乎是最广泛的。但是,由于Kotlin中的对象默认为final,因此仅适用于标记为“open”的对象。理想情况下,我希望避免必须“打开”对象,以便可以缓存它们。

还有其他方法可以让我的工作吗?

spring-boot kotlin spring-data-redis jackson2
1个回答
3
投票

我有同样的问题。你应该使用“开放”类。但这对数据类没有帮助,因为你不能让它们“开放”。 有一个名为“全开”的插件,您可以在其中定义注释。如果使用这些注释,则类变为“开放”,甚至是数据类。

spring-kotlin插件在引擎盖下使用“全开”插件,因此像@ Service,@ Component等弹簧注释使AOP打开类,因为代理要求你继承类。

如果你使用spring-kotlin插件,那么有一个很好的注释可以解决你的问题,它在Spring Cache中使用,它的名字是@Cacheable。如果你在类上使用@Cacheable,当你包含这个代码时,它们将变为open并将它们的type-in​​fo保存到json(例如:{@ class:“com.example.MyClass”,...}):

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

val serializer = GenericJackson2JsonRedisSerializer(objectMapper)

更多细节:https://kotlinlang.org/docs/reference/compiler-plugins.html

简而言之:除了将@Cacheable注释添加到您想要的类之外,您不必执行任何操作,并且它也符合IMO的意义。

© www.soinside.com 2019 - 2024. All rights reserved.