NumberformatException / if /문자 1글자 비교 / equals / 이슈 | MyBatis

2016. 1. 5. 17:00framework/MyBatis



ex 1)

<if test="stringValue == 'Y'">
</if>


ex 2)

<if test="condition.equals('Y')">

</if>

 

 

 

지금처럼 한 글자를 다이나믹쿼리 IF  안에서 비교할 때

java.lang.NumberFormatException: For input string: "Y" 에러 또는

비교가 되지 않을 수 있다. (인식 불가 혹은 오작동 가능성도 있음)

 





결론적으로 위 현상은 myBatis 문제는 아니고

OGNL(Object Graph Navigation Language) 의 문제이다.

OGNL 인터프리터에서는 위 구문의 'Y' 를 char 형으로 인식하고,

'YY' 나 "Y" 는 String으로 인식한다. (따옴표를 잘보자)

그래서 <if test="stringValue == 'Y'"> 이와 같은 구문을 비교할 때 

 NumberFormat으로 비교를 시도하여 Exception이 발생한다.

이유는 java의 char형은 실제로 문자의 코드값을 저장하기 때문이다.


그래서 아래와 같은 형변환이 가능하다

char y = 'Y';

int code = (int)y; // code에는 Y의 코드값인 89가 저장된다



그래서 위와 같은 상황을 피하기 위해서는 다음과 같은 해결책이 존재한다.


1. <if test='stringValue == "Y"'> – 쌍따옴표와 홑따옴표의 위치를 변경


2. <if test="stringValue == &quot;Y&quot;"> – 쌍따옴표를 HTML 코드로 변경


3. <if test="stringValue == 'Y'.toString()"> – toString() 함수를 사용해 String 형으로 변환


4. 함수 생성 (equals 함수를 새로 생성하고 가져다 쓰는 방법 )

 

http://cofs.tistory.com/97 에서 설명하고 있는

함수를 생성해서

사용방법을 참조하여 equals함수를 재정의


1번과 4번 방법을 추천한다.

 

 

 

 

 

 

ps.

1번 방법 사용시 == 대신에 equals 함수를 추천한다.

따옴표에 구애받지 안으려면 4번방법을 추천한다.