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)
我在理解 的不同值时遇到了一些麻烦,DefaultTyping
但NON_FINAL
似乎是最广泛的。但是,由于 Kotlin 中的对象默认是 final 的,这仅适用于标记为“open”的对象。理想情况下,我想避免“打开”对象只是为了缓存它们。
有没有其他方法可以让我完成这项工作?
我有同样的问题。您应该使用“开放”类。但这不会帮助您处理数据类,因为您无法使它们“打开”。
有一个名为“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。
归档时间: |
|
查看次数: |
2577 次 |
最近记录: |