강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của woop
woop

câu hỏi đã được viết

Lớp học thành thạo Kotlin thông qua thực hành dự án máy chủ ngân hàng

redisConfig 질문입니다

Đã giải quyết

Viết

·

99

0

package org.example.config

import org.redisson.Redisson
import org.redisson.api.RedissonClient
import org.redisson.config.Config
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.connection.RedisStandaloneConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
import org.springframework.data.redis.core.RedisTemplate
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
import org.springframework.data.redis.serializer.StringRedisSerializer
import java.time.Duration

@Configuration
class RedisConfig {

    @Bean
    fun redisConnectionFactory(
        @Value("\${database.redis.host}") host: String,
        @Value("\${database.redis.port}") port: Int,
        @Value("\${database.redis.password:${null}}") password: String?,
        @Value("\${database.redis.database:${0}}") database: Int,
        @Value("\${database.redis.timeout:${10000}}") timeout: Long,
    ) : LettuceConnectionFactory {
        val config = RedisStandaloneConfiguration(host, port).apply {
            password?.let { setPassword(it) }
            setDatabase(database)
        }

        val clientConfig = LettuceClientConfiguration.builder()
            .commandTimeout(Duration.ofSeconds(timeout))
            .build()

        return LettuceConnectionFactory(config,clientConfig)
    }

    @Bean
    @Primary
    fun redisTemplate(connectionFactory : RedisConnectionFactory): RedisTemplate<String, String> {
        val template = RedisTemplate<String, String>()

        template.connectionFactory = connectionFactory
        template.keySerializer = StringRedisSerializer()
        template.valueSerializer = Jackson2JsonRedisSerializer(String::class.java)
        template.hashKeySerializer = StringRedisSerializer()
        template.hashValueSerializer = Jackson2JsonRedisSerializer(String::class.java)
        template.afterPropertiesSet()

        return template
    }


    @Bean
    fun redissonClient(
        @Value("\${database.redisson.host}") host: String,
        @Value("\${database.redisson.timeout}") timeout: Int,
        @Value("\${database.redisson.password:${null}}") password: String?,
    ) : RedissonClient {
        val config = Config()

        val singleServerConfig = config.useSingleServer()
            .setAddress(host)
            .setTimeout(timeout)

        if (!password.isNullOrBlank()) {
            singleServerConfig.setPassword(password)
        }

        return Redisson.create(config).also {
            println("redisson create success")
        }
    }


}
  • An annotation argument must be a compile-time constant

와 같은 에러가 나는데 강의 파일 코드로도 같은 에러가 납니다

kotlinmysqlmongodbkafkaredis

Câu trả lời 1

0

Hong님의 프로필 이미지
Hong
Người chia sẻ kiến thức

woo님 안녕하세요 질문 남겨주셔서 감사합니다!

혹시 컴파일 하실 떄 사용하시는 java 버전 정보를 알 수 있을까요??

woo님의 프로필 이미지
woo
Người đặt câu hỏi

현재 build.gradle.kts의 정보는 다음과 같습니다

 

plugins {
    id("org.springframework.boot") version "3.2.2"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.22"
    kotlin("plugin.spring") version "1.9.22"
    kotlin("plugin.jpa") version "1.9.22"
    kotlin("plugin.serialization") version "1.8.0"
}

tasks.test {
    useJUnitPlatform()
}
kotlin {
    jvmToolchain(17)
}
Hong님의 프로필 이미지
Hong
Người chia sẻ kiến thức

공유해주셔서 감사합니다.

코드상의 오타가 있었네요 현재

redisConnectuonFactory 함수에서의 password에 문제가 있습니다.

Kotlin에서 ${null}에 대해서 런타임에서는 표현식으로 인식하기 때문에 컴파일 에러가 발생을 하는것입니다.

 

그냥 간단하게 {database.redis.password:} 로 수정하신다면 문제가 해결되는것으로 보입니다!!

 

woo님의 프로필 이미지
woo
Người đặt câu hỏi

확인했습니다! 말씀대로 {database.redis.password:}로 바꾸니 잘 대입되는군요

Hình ảnh hồ sơ của woop
woop

câu hỏi đã được viết

Đặt câu hỏi