진행하고 있던 프로젝트에 MyBatis를 적용하다가 에러가 나서 정리해 둔다.
발생한 에러는 아래와 같다.
* 에러 메세지
심각: Servlet.service() for servlet [action] in context with path [/xxx] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for xxxMapper ### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for [xxxMapper] with root cause java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for xxxMapper |
** 위의 메세지 중 프로젝트 명이 표기되는 부분은 xxxMapper로 바꾸어 표기했다.
* 원인
: 위와 같은 에러가 발생할 경우 아래와 같이 여러 원인이 존재할 수 있다고 한다.
(1) mapper id가 틀린 경우
(2) Parameter와 bean의 field명이 틀린 경우
(3) sql.xml에서 정의된 namespace와 DAO에서 호출하는 namespace가 다를 경우
(4) mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우
(5) mapper에 정의된 namespace 명칭이 같은 Application 내에 중복 될 경우
* 해결
: 나의 경우엔 4번이 원인이었다. Mapper 파일 명시 할 때 대소문자 구분을 하지 않아 mapper 파일을 못찾으면서 발생한 에러였다.
: mapper 파일 명시했던 설정 파일 보면 mapperLocation 속성에 *_maria.xml 파일이라 명시되어 있다.
--> context-datasource.xml 파일 내 설정(AS-IS)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" /> <property name="mapperLocations"> <value>classpath:/mapper/**/*_maria.xml</value> </property> </bean> |
: 해당 mapper 파일은 실제로 *_Maria.xml 파일이기 때문에 대소문자 수정이 필요하다 ㅎㅎㅎㅎ 이런 실수는 다음엔 하지 말기
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" /> <property name="mapperLocations"> <value>classpath:/mapper/**/*_Maria.xml</value> </property> </bean> |
: 위와 같이 오타를 수정하고나서 다시 돌려보니 이제 제대로 mapper 파일을 찾았다 ㅎㅎ
내경우 말고도 위의 에러 원인 가능한 5가지 경우는 주의해야겠다.
__________________________________________________________________________________________________________________________________________________________
** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :)
** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.