@RequestParam 관련 (해결중) java.lang.ClassCastException

pickylemon·2024년 4월 30일

Exception 모음

목록 보기
6/31

org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: 경로 [/pf]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')]을(를) 발생시켰습니다.
java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
at com.portfolio.www.controller.BoardController.listPage(BoardController.java:36)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

상황

Controller에서 @RequestParam으로 HashMap을 받으려는 상황.
HashMap의 지네릭은 페이징에 필요한 데이터를 받기 위해 <String, Integer>으로 설정한 상태였다.
map에서 value를 꺼내려고 하니 ClassCastException 발생.

원인

@RequestParam으로 받을 수 있는 HashMap은 <String, Object> 또는 <String, String> 타입만 가능한가보다.
아무래도 parameter니까 기본적으로 String타입이라 그런걸까.

해결

<String, String>으로 바꾸고 Integer가 필요한 곳에서 형변환을 직접 해줌.
기본형(primitive, String, Wrapper)은 컨트롤러 메서드의 인자로 들어올때 자동 형변환이 발생하는데, 그래서 Map<String, Integer>도 자동 형변환이 가능할 것이라 생각했다.
Map<String,String>을 Map<String,Integer> 타입으로 형변환 해주는 컨버터가 없어서인가 싶어서 컨버터를 구현했는데, conversionService에 등록하는 부분에서 또 다른 난관에 부딪힘 ㅠㅠ
해당 컨트롤러에서 @InitBinder 메서드로 내가 만든 컨버터를 등록한 conversionService를 binder에 세팅해주려는데,
이미 default로 세팅된 ConversionService가 있어서 그런지 에러남.

찾아보니 이미 MapToMapConverter가 스프링에 있던데,
org.springframework.core.convert.support.MapToMapConverter. 이 클래스는 private final ConversionService를 안에 가지고 있다.
?? 이미 컨버터 있는데 왜 내가 원하는 Map<String, Integer>로 받을 수 없었던 걸까?


일단은
1) @RequestParam을 Map<String, String>으로 받고 필요한 곳에서 Integer.valueOf로 형변환을 진행하거나
2) 컨트롤러에서 Map형태가 아닌, 아예 기본 타입으로 parameter를 받아버리거나 (ex. Integer page, Integer size) 하는 방향으로 해결은 했다만

여전히 Map<String, Integer>의 binding에 대해서 의문이 남는다.

유사한 상황

https://okky.kr/questions/480732

참고자료

profile
안녕하세요

0개의 댓글