본문 바로가기
Java/Java with Error

[해결 방법] no suitable constructor found for Jackson2JsonRedisSerializer(Class<CAP#1>)

by HJ0216 2024. 11. 24.
Environment
Language: Java17
Framework: SpringBoot 3.1.0

 

오류

constructor Jackson2JsonRedisSerializer.Jackson2JsonRedisSerializer(Class<T>) is not applicable(argument mismatch; Class<CAP#2> cannot be converted to Class<T>)
constructor Jackson2JsonRedisSerializer.Jackson2JsonRedisSerializer(JavaType) is not applicable(argument mismatch; Class<CAP#2> cannot be converted to JavaType)
where T is a type-variable:
  T extends Object declared in method <T>set(String,T,long)
where CAP#1,CAP#2 are fresh type-variables:
  CAP#1 extends Object from capture of ? extends Object
  CAP#2 extends Object from capture of ? extends Object

Jackson2JsonRedisSerializer의 생성자에서 Class<T> 타입을 요구

컴파일러가 제네릭 타입을 캡처한 결과인 CAP#2는 T 타입으로 변환할 수 없음

  * CAP#1, CAP#2: 컴파일러가 제네릭 타입을 추론할 때 사용하는 임시 이름으로, T가 ? extends Object (모든 타입을 포함하는 와일드카드)로 사용될 때 부여

 

 

 

원인

public <T> void set(String key, T o, long milliseconds) {
  redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<T>(o.getClass()));
  redisTemplate.opsForValue().set(key, o, milliseconds, TimeUnit.MILLISECONDS);
}

제너릭 타입(<>)에 파라미터(T)를 명시할 경우, 컴파일러가 T의 타입을 자동으로 추론할 수 없음

T의 명확한 타입을 아는 것이 아니라 단순히 와일드 카드(? extends Object)인 것만 알고 있는 상태이므로 o.getClass와 T를 매칭시키지 못함

따라서, 타입을 명시했지만 컴파일 시점에는 타입을 알 수 없어 오류 발생

 

 

해결

public <T> void set(String key, T o, long milliseconds) {
  redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(o.getClass()));
  redisTemplate.opsForValue().set(key, o, milliseconds, TimeUnit.MILLISECONDS);
}

파라미터를 명시하지 않고 타입만 선언(<>)하여, 컴파일러에게 타입 추론 자체를 위임

 

 

 

🙋‍♀️

본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.

 

📑

참고 자료

Chat GPT