문제 상황
기존 코드
// Java source
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
String name = "kim";
String num = "12345";
Map<String, Object> map= new HashMap<String, Object>();
map.put("name", name);
map.put("num", num);
map.put("dvcd", "D"); //일단위 or 월단위
list = mapper.selectQuery(map);
//mapper.xml source
<choose>
<when test="dvcd == 'D'">
</when>
<otherwise>
</otherwise>
</choose>
평소처럼 MyBatis를 사용하던 중 다음과 같은 에러 메시지가 떴다.
기존에 쓰던 코드와 크게 다를 바가 없는데 NumberFormatException가 일어났다.
### Error querying database. Cause: java.lang.NumberFormatException: For input string:"D"
### Cause: java.lang.NumberFormatException: For input string: "D"
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause:ㅜjava.lang.NumberFormatException: For input string: "D"
### Cause: java.lang.NumberFormatException: For input string: "D"
해결 방법
검색 해보니 OGNL 인터프리터가 위 코드 중 <when test="dvcd == 'D'">에서
‘D’를 String이 아닌 char 형으로 인식하기 때문에 생기는 에러였다.
MyBatis 문법 내에서 한 글자를 ' ' (작은따옴표)에 담으면 char 형식으로 인식하기 때문에
String 형식으로 인식하기 위해서는 " " (큰따옴표)에 담아줘야 한다.
두 글자 이상 부터는 ' ', " "에 상관없이 String 형식으로 인식한다.
예시)
- 'D' : char
- "D" : String
- 'DD' : String
위의 내용을 토대로 본인이 작성한 코드를 다시 살펴보면
map에서 "dvcd" key에 해당하는 값은 String 형태인 "D"이고
map.put("dvcd", "D");
→ String
mapper 내 MyBatis 문법에서 dvcd와 비교하는 값인 'D'는 char 형태로 인식이 되어
"dvcd == 'D'" 식은 결국 "D" == 'D' 가 되므로 해당 식은 에러가 발생한다. (char와 String 비교 불가)
<when test="dvcd == 'D'">
→ String == char (x)
따라서 char가 아닌 String으로 인식시키기 위해서 기존 작성 코드에서
test='dvcd == "D"' 의 형태로 작은따옴표와 큰따옴표 위치를 변경해주면 해당 에러를 해결할 수 있다.
에러 코드
<when test = "dvcd == 'D' ">
수정 코드
<when test = 'dvcd == "D" '>
참고
mybatis에서 NumberformatException이 나는 경우
java.lang.NumberFormatException: For input string: “” 에러 해결방법 Error querying database. Cause: java.lang.NumberFormatException: For input string: “y” Cause: java.lang.NumberFormatException: For input string: “y” myBatis 사용시 위
itallinform.tistory.com
마이바티스 org.apache.ibatis.exceptions.PersistenceException 에러
잘 사용하던 화면에서 갑자기 아래 에러가 발생 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException 마이바티스 문법상 아래 문법이 맞으나 AND TRIM(T1.ITEM_CODE) = #
subinto.tistory.com
MyBatis에서 자주하는 실수 : 작은따옴표의 구분
요새 MyBatis를 자주 쓰다보니 나쁜 프로그래밍 습관때문에 자주 만나는 오류가 하나 있습니다. 1...
blog.naver.com
'프로그래밍' 카테고리의 다른 글
[git] git 알고쓰자 / git 명령어 모음 (0) | 2024.03.24 |
---|---|
[넥사크로] Dark Mode/Black Theme 설정하는 방법 (0) | 2023.02.25 |