我有一个用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中的对象是最终对象,因此这仅适用于标记为“打开”的对象。理想情况下,我想避免不得不“打开”对象,以便可以对其进行缓存。
还有其他方法可以使这项工作成功吗?
答案 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)