전자정부프레임워크로 개인적으로 이것저것 만들어보고 있는데요.
iBatis의 include 기능을 사용하는데 자꾸 이런 에러가 발생해서 2시간도 넘게 헤맸습니다 ㅠㅠ
Caused by: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'. Cause: java.lang.RuntimeException: Could not find SQL statement to include with refid 'moaInclude.pageHeader'
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:123)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:84)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:102)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:72)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:60)
... 47 more
분명히 있는데 말이죠.
MoaBibleToday.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <sqlMap namespace="moaBibleToday"> <typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/> <typeAlias alias="moaBibleVo" type="egovframework.moa.bible.model.MoaBibleVO"/> <select id="MoaBibleDAO.getBibleTodayListAjax" parameterClass="moaBibleVo" resultClass="egovMap"> <include refid="moaInclude.pageHeader"/> <![CDATA[ /* MoaBibleDAO.getBibleTodayListAjax */ SELECT * FROM MOA_BIBLE_TODAY_WORDS ]]> <include refid="moaInclude.pageFooter"/> </select> </sqlMap> | cs |
MoaInclude.xml (include 파일)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <sqlMap namespace="moaInclude"> <sql id="pageHeader"> <![CDATA[ /* pageHeader */ SELECT * FROM ( SELECT ROWNUM RNUM, ALL_LIST.* FROM ( ]]> </sql> <sql id="pageFooter"> <![CDATA[ /* pageFooter */ ) ALL_LIST ) WHERE RNUM > #firstIndex# AND RNUM <= #firstIndex# + #recordCountPerPage# ]]> </sql> </sqlMap> | cs |
include되는 파일도 문제없고,
refid로 참조하는 부분도 아무 문제가 없습니다.
<select id="MoaBibleDAO.getBibleTodayListAjax" parameterClass="moaBibleVo" resultClass="egovMap">
<include refid="moaInclude.pageHeader"/>
<![CDATA[
/* MoaBibleDAO.getBibleTodayListAjax */
SELECT *
FROM MOA_BIBLE_TODAY_WORDS
]]>
<include refid="moaInclude.pageFooter"/>
</select>
아무리해도 안되서 이렇게도 해봤습니다.
파일을 include하지 않고 이렇게 같은 파일에서 참조해 봤습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <sqlMap namespace="moaBibleToday"> <typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/> <typeAlias alias="moaBibleVo" type="egovframework.moa.bible.model.MoaBibleVO"/> <sql id="pageHeader"> <![CDATA[ /* pageHeader */ SELECT * FROM ( SELECT ROWNUM RNUM, ALL_LIST.* FROM ( ]]> </sql> <sql id="pageFooter"> <![CDATA[ /* pageFooter */ ) ALL_LIST ) WHERE RNUM > #firstIndex# AND RNUM <= #firstIndex# + #recordCountPerPage# ]]> </sql> <select id="MoaBibleDAO.getBibleTodayListAjax" parameterClass="moaBibleVo" resultClass="egovMap"> <include refid="pageHeader"/> <![CDATA[ /* MoaBibleDAO.getBibleTodayListAjax */ SELECT * FROM MOA_BIBLE_TODAY_WORDS ]]> <include refid="pageFooter"/> </select> </sqlMap> | cs |
이렇게 하니 아무 문제없이 잘 되네요.
그래도... 뭔가 찜찜합니다.
include되는 쿼리들은 같은 파일이 아닌 다른 파일에 두고 참조하고 싶으니까요.
왜냐하면 다른 iBatis 파일에서도 이 include 되는 쿼리를 참조해야 하거든요.
2시간 넘게 구글링하고 이것저것 해보다가 간신히 찾아냈네요.
역시 구글링하면 나오긴 나오는군요~~~~^^
iBatis 파일들을 셋팅해주는 파일이 문제였더라구요.
sql-map-config-mysql-moa.xml
1 2 3 4 5 6 | <sqlMapConfig> <settings useStatementNamespaces="true" /> <sqlMap resource="egovframework/sqlmap/moa/include/MoaInclude.xml"/> <sqlMap resource="egovframework/sqlmap/moa/bible/MoaBible.xml"/> <sqlMap resource="egovframework/sqlmap/moa/bible/MoaBibleToday.xml"/> </sqlMapConfig> | cs |
이렇게 해주니 잘 되는군요.
<settings useStatementNamespaces="true" />
이 부분이 있어야 include된 파일의 namespace를 사용할 수 있어서 refid를 가져올 수 있더군요.
useStatementNamespaces="false"가 기본 셋팅이라 namespace를 사용하지 못했던 거구요.
또한 resource 파일의 순서도 중요하더라구요.
include되는 파일이 먼저 와야 합니다.
혹시 같은 오류로 고생하셨다면 참고하세요~
댓글