我有一个用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-kotlin插件在引擎盖下使用“全开”插件,因此像@ Service,@ Component等弹簧注释使AOP打开类,因为代理要求你继承类。
如果你使用spring-kotlin插件,那么有一个很好的注释可以解决你的问题,它在Spring Cache中使用,它的名字是@Cacheable。如果你在类上使用@Cacheable,当你包含这个代码时,它们将变为open并将它们的type-info保存到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的意义。