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

时间:2018-09-10 20:51:43

标签: spring-boot kotlin spring-data-redis jackson2

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

{=IF(ROWS($C$5:C5)>$C$2,"",INDEX($A$2:$A$16,SMALL(IF(FREQUENCY(IF($A$2:$A$16<>"",MATCH($A$2:$A$16,$A$2:$A$16,0),0),ROW($A$2:$A$16)-ROW($A$2)+1),ROW($A$2:$A$16)-ROW($A$2)+1),ROWS($C$5:C5))))}

我在理解@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似乎是最广泛的。但是,由于默认情况下Kotlin中的对象是最终对象,因此这仅适用于标记为“打开”的对象。理想情况下,我想避免不得不“打开”对象,以便可以对其进行缓存。

还有其他方法可以使这项工作成功吗?

3 个答案:

答案 0 :(得分:3)

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

spring-kotlin插件在幕后使用“全开”插件,因此@Annotation之类的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)

更多详细信息:https://kotlinlang.org/docs/reference/compiler-plugins.html

简短地说:除了将@Cacheable注释添加到所需的类之外,您无需执行任何其他操作,从某种意义上说,它也适合IMO。

答案 1 :(得分:0)

issues已解决。因此,我们可以从代码中删除@Cacheble hack。您必须在下一个实现中修改ObjectMapper

val om = ObjectMapper()
            .registerModule(KotlinModule())
            .registerModule(JavaTimeModule())
            .activateDefaultTyping(BasicPolymorphicTypeValidator.builder()
                .allowIfBaseType(Any::class.java)
                .build(), ObjectMapper.DefaultTyping.EVERYTHING)

val serializer = GenericJackson2JsonRedisSerializer(om)

修复了Maven Jackon依赖性

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0.pr2</version>
</dependency>

答案 2 :(得分:0)

您可以看一下:

https://github.com/endink/caching-kotlin

它同时支持杰克逊和克里奥