Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- nestjs
- 펀널
- 이터널리턴
- 코딩공부
- 라인광고플랫폼
- git
- 토이프로젝트
- 스케치퀴즈
- 영원회귀
- 광고플랫폼
- 개인앱
- 구글검색광고
- git pull
- 메모장앱
- 플러터
- 블랙서바이벌
- 캐치마인드
- 카카오톡공유하기
- submodules
- Redis
- nodejs
- 사이드프로젝트
- Kotlin
- 카카오톡
- funnel
- 개발자를_위한 #PPT팁
- 스케치데브
- 부업
- 룩백
- 페이스북광고
Archives
- Today
- Total
가을기 Workspace
[kotlin] RedisTemplate Kotlin cannot be re-assigned 본문
본 포스팅은 회사일 하면서 트러블슈팅 기록을 적은 글입니다.
문제
class RedisTemplateFactory(
private val redisConnectionFactory: RedisConnectionFactory,
private val objectMapper: ObjectMapper
) {
private val stringRedisSerializer = StringRedisSerializer()
fun getRedisTemplate(): RedisTemplate<String, String> {
return getRedisTemplate(stringRedisSerializer, stringRedisSerializer)
}
private fun <K, V> getRedisTemplate(
keySerializer: RedisSerializer<K>,
valueSerializer: RedisSerializer<V>
): RedisTemplate<K, V> {
return RedisTemplate<K, V>().apply {
this.keySerializer = keySerializer
this.hashKeySerializer = keySerializer
this.valueSerializer = valueSerializer
this.hashValueSerializer = valueSerializer
this.connectionFactory = redisConnectionFactory
this.afterPropertiesSet()
}
}
}
class RedisTemplateFactory(
private val redisConnectionFactory: RedisConnectionFactory,
private val objectMapper: ObjectMapper
) {
private val stringRedisSerializer = StringRedisSerializer()
fun getRedisTemplate(): RedisTemplate<String, String> {
return getRedisTemplate(stringRedisSerializer, stringRedisSerializer)
}
private fun <K, V> getRedisTemplate(
keySerializer: RedisSerializer<K>,
valueSerializer: RedisSerializer<V>
): RedisTemplate<K, V> {
return RedisTemplate<K, V>().apply {
this.keySerializer = keySerializer
this.hashKeySerializer = keySerializer
this.valueSerializer = valueSerializer
this.hashValueSerializer = valueSerializer
this.connectionFactory = redisConnectionFactory
this.afterPropertiesSet()
}
}
}
위의 코드는 겉으로 보기에 아무 문제가 없다.
하지만 컴파일 해보면
RedisTemplateFactory.kt: (29, 13): Val cannot be reassigned
이런 에러가 뜬다.
왜그럴까?
원인
https://youtrack.jetbrains.com/issue/KT-31531
public class RedisTemplateSimulator {
private @Nullable // <-- member는 nullable
RedisConnectionFactory connectionFactory;
@Nullable // <-- getter 도 nullable
public RedisConnectionFactory getConnectionFactory() {
return connectionFactory;
}
public void setConnectionFactory(RedisConnectionFactory connectionFactory) { // <-- setter는 nullable이 없음
this.connectionFactory = connectionFactory;
}
}
nullable의 scope이 다른 것이 문제다.
해결
class RedisTemplateFactory(
private val redisConnectionFactory: RedisConnectionFactory,
private val objectMapper: ObjectMapper
) {
private val stringRedisSerializer = StringRedisSerializer()
fun getRedisTemplate(): RedisTemplate<String, String> {
return getRedisTemplate(stringRedisSerializer, stringRedisSerializer)
}
private fun <K, V> getRedisTemplate(
keySerializer: RedisSerializer<K>,
valueSerializer: RedisSerializer<V>
): RedisTemplate<K, V> {
return RedisTemplate<K, V>().apply {
this.keySerializer = keySerializer
this.hashKeySerializer = keySerializer
this.valueSerializer = valueSerializer
this.hashValueSerializer = valueSerializer
setConnectionFactory(redisConnectionFactory)
this.afterPropertiesSet()
}
}
}
깔끔한 해결책은 아니지만, explicit 하게 setter를 호출하는 수 밖에 없겠다.
끝.
Comments