Я пытаюсь заменить некоторый Java-код на kotlin.
Например, jpa или cache.
Класс «Пуск»:
@EnableAsync @EnableCaching @EnableSwagger2 @SpringBootApplication open class Application fun main(args: Array<String>) { SpringApplication.run(Application::class.java) }
Простой контроллер:
@RestController class CacheController { @Autowired private lateinit var cache: CacheService @PutMapping("{id}") fun save(@PathVariable id: Long) { cache.save(id) } }
CacheService:
@Component @CacheConfig(cacheNames = arrayOf("longCacheManager"), cacheManager = "longCacheManager") open class CacheService { @Cacheable(key = "#id") fun save(id: Long): Long { return id } }
cacheManager:
@Configuration open class CacheConfig { @Autowired private lateinit var redisConnectionFactory: RedisConnectionFactory @Bean @Qualifier("longCacheManager") open fun longCacheManager(): CacheManager { val redisTemplate = StringRedisTemplate(redisConnectionFactory) redisTemplate.valueSerializer = GenericToStringSerializer(Long::class.java) val cacheManager = RedisCacheManager(redisTemplate) cacheManager.setUsePrefix(true) return cacheManager } }
Я могу подтвердить параметр id, введенный в метод метода CacheService, но после того, как я освобожу PutMethod, в redis нет ничего.
Когда я пишу cacheServie с java, как это, redis будет сохранять то, что я хочу.
Служба кеша Java:
@Component @CacheConfig(cacheNames = "longCacheManager", cacheManager = "longCacheManager") public class JavaCacheService { @Cacheable(key = "#id") public Long save(Long id) { return id; } }
Я также прочитал статью вроде этого: https://pathtogeek.com/spring-boot-caching-with-kotlin
Моя SpringBootVersion – 1.5.3.RELEASE
и kotlinVersion – 1.1.3-2
Спасибо всем, я исправлю это, сделав метод кеша открытым
@Component @CacheConfig(cacheNames = arrayOf("longCacheManager"), cacheManager = "longCacheManager") open class CacheService { @Cacheable(key = "#id.toString()") open fun save(id: Long): Long { return id } }
Spring создавал прокси с cglib.
Он должен обязательно наследовать классы и методы.
Но kotlin default – это final class
и метод, который без ключевого слова open
.