AdSense

網頁

2019/2/10

Maven test Mybatis Binding Invalid bound statement錯誤

今天執行mvn package打包專案時,進行test階段時出現org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)錯誤。

在Eclipse中直接執行JUnit是正常的,MyBatis配置一切正常,但就是在打包測試階段就會報錯。

原因在Eclipse中若把XML Mapper的xml文件放到Source Folder(src/main/java)中,在Eclipse編譯時會一起放入classes目錄所以不會出錯;但Maven編譯的時候不會將src/main/java中的靜態文件放入classes,所以導致XML Mapper找不到而報錯。必須將XML Mapper放在src/main/resources下靜態文件才會被放入classes。


若仍要將XML Mapper放在src/main/java下,解決方法是在pom.xml中使用Maven Resources Plugin<resources>指定建置時要加入的資源(resources)

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

    <resources>
        <!-- 指定src/main/resources -->
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <!-- 指定src/main/java下的idv.matt.mapper pakcage中的所有xml建置時都要放入classes-->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>idv/matt/mapper/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

設定完以上後Maven編譯時就會把src/main/java中的XML Mapper放在classes,在test的時候就不會出現找不到Mapper的問題。


未設定<resources>前,預設會讀取src/main/resources的資源;然而一旦設定<resources>,則此預設行為就會消失,所以除了指定的XML Mapper的路徑外,也必須把src/main/resources設定在<resources>中。


另一個解決方法是只要把XML Mapper檔中的內容稍為更動一下存檔後就解決了,真是太神奇了傑克。


參考:

沒有留言:

AdSense