티스토리 뷰

발생일: 2010.02.10

문제:
iBatis 에 parameterClass 로 List 를 넘긴 후,
iterate 태그 사용을 시도하였을 경우 아래와 같은 예외가 발생한다.

Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException


이 때 사용된 iBatis 구문은 아래와 같다.

<select id="selectSomething" parameterClass="list">
    // select something and use iterate
    <iterate property="someList">
        #someList[]#
    </iterate>
</select>


잘못된 게 없는 것 같은데, 왜 이럴까.


해결책:
정확한 원인은 모르겠으나, 일단 패러미터를 Map 형태로 전달해주면 문제 없이 작동한다.

queryForList 등의 메서드를 호출하기 전,
패러미터로 전달할 list 객체를 Map 객체로 감싼 후 전달하도록 한다.

<select id="selectSomething" parameterClass="map">
    // select something and use iterate
    <iterate property="someList">
        #someList[]#
    </iterate>
</select>


BUT, 아래 더 올바른 해결 방법이 있다.
=================================================================
# 추가. 2010.02.11

list 를 패러미터로 전달 시 iterate 태그에서 property 를 설정하면,
전달된 list 에서 해당 property 를 찾으려고 시도하는 것 같다.
<iterate> 태그에서 property 속성을 제거하면 정상적으로 작동한다.

<select id="selectSomething" parameterClass="list">
    // select something and use iterate
    <iterate> // iterate 태그 내 property 속성을 제거하라
        #someList[]#
    </iterate>
</select>


참고: iBatis: Support for Array or List Parameter with SQL IN Keyword



반응형
댓글
공지사항