Как я могу легко кэшировать объекты Kotlin в Redis, используя json через Джексона? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть загрузочное приложение Spring, написанное на Kotlin, где я хотел бы включить кэширование в 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 по умолчанию являются окончательными, это работает только для объектов, помеченных как «открытые».В идеале я бы хотел избежать «открытия» объектов просто для того, чтобы их можно было кэшировать.

Есть ли другой способ сделать эту работу?

1 Ответ

0 голосов
/ 26 февраля 2019

У меня была такая же проблема. Вы должны использовать «открытые» классы. Но это не поможет вам с классами данных, потому что вы не можете сделать их «открытыми».
Существует плагин под названием «все открыто», где вы можете определять аннотации. Если вы используете эти аннотации, классы становятся «открытыми», даже классы данных.

Плагин spring-kotlin использует плагин "all-open" под капотом, поэтому аннотации Spring, такие как @Service, @Component и т. Д., Делают классы открытыми для 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...