본문 바로가기
프로그래밍

[MyBatis] Cause: java.lang.NumberFormatException:

by joeun 2023. 3. 26.

문제 상황


기존 코드 

// 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