전자정부프레임워크,ibsheet, ibatis, mysql 환경에서 조회 작업 중에
데이터를 불러온 후 egovmap에 담아 return하는 과정에서
자꾸 java.lang.Integer cannot be cast to java.lang.String 오류가 났다.
리턴받는 곳에서는 List<Map<String, Object>> 형식으로 담고있었기 때문에
형변환 오류가 날 일이 없어서 처음에는 버전문제로인한 자동형변환 오류인가 했는데
(처음에는 ibatis 문제인줄알았음)
원인을 추적하다보니 ibsheet를 사용할때 select해온 데이터들을 가공처리하는 xml파일코드 에서
문제가 생긴것이였다.
Oracle을 사용할땐 전혀 문제없이 공통적으로 사용하던 코드였기때문에 완전 반전이엿다.
(아마 egovmap과 맵핑될때 데이터타입 Mysql int을 사용하면 Oracle Number일때랑은 뭔가 다르게 맵핑되는 듯?)
문제가 되었던 코드는 요거다.
<TD><![CDATA[<%=StrUtil.nvl((String)map.get(arrColsId[j]))%>]]></TD>
문제를 설명하기 전 알아두어야 할것이있다.
문자열 형변환 3가지
1. (String)
-> 대상변수가 null 이면 "null"로 출력
Object에 담긴 값이 String이 아니면 ClassCastException 발생
2.toString()
-> 대상변수가 null 이면 NullPointException 발생
Object에 담긴 값이 String이 아니어도 출력한다.
3. String.valueOf()
-> 대상변수가 null 이면 "null"로 출력
그로인해 null 체크시 "null".equals( String ) 형태로 해야함
null 로 인해 발생된 에러는 디버깅하기 어렵기때문에 NPE방지를 위해 String.valueOf()를 사용하는 것을 추천!
<TD><![CDATA[<%=StrUtil.nvl((String)map.get(arrColsId[j]))%>]]></TD>
즉 위 코드에서 map.get(key값)을 통해 구해진 값이 Integer 값이 였기때문에 (String)으로 형변환을 시도하니
ClassCastException이 발생되었던 것이다.
위 코드를
<TD><![CDATA[<%=StrUtil.nvl(String.valueOf(map.get(arrColsId[j])))%>]]></TD>
로 바꾸니 정상출력되었다!
'퇴근후공부 > 잊지마코드' 카테고리의 다른 글
REST API 정리 (0) | 2023.02.09 |
---|---|
JPA 공부하기 (0) | 2023.02.07 |
D-Day 깔끔하게 계산하기 (0) | 2023.02.07 |
slideup (0) | 2022.04.28 |
MySQL, Oracle 자바에 맵핑되는 데이터타입 차이 (0) | 2021.08.24 |