본문 바로가기
프로그래밍 언어/전자정부 표준프레임워크

[전자정부 프레임워크] Error parsing XPath '/sqlMap/select'. Cause: java.lang.RuntimeException: Could not find SQL statement to include with refid '***.***'

by 우림 2016. 9. 7.

전자정부프레임워크로 개인적으로 이것저것 만들어보고 있는데요.

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되는 파일이 먼저 와야 합니다.


혹시 같은 오류로 고생하셨다면 참고하세요~



댓글