概述
1. 定位mapper.xml中的錯誤一直是個比較尷尬的問題,很多時候,只能確定是xml除了問題,卻不知道是哪一個。
2. 具體錯誤:
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
2019-05-06 17:09:37,059 [RMI TCP Connection(2)-127.0.0.1] DEBUG org.mybatis.spring.SqlSessionFactoryBean - Parsed configuration file: 'class path resource [mybatis.xml]'
一直循環打印同樣的語句,並且提示,XxxMapper文件循環引用blabla。
3. 先說個(導致錯誤的)操作,把Timestamp修改爲LocalDateTime。
查找錯誤原因
1. 首先,找到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory類;
2. 接着,找到protected void autowireByType(……)方法,並找到對應的catch。如下:
catch (BeansException ex) {
throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
}
在拋出異常的位置(即throw new UnsatisfiedDependencyException(……)語句所在的位置)打上斷點即可。
3. 最後,當程序執行到斷點的位置。利用Debug,查看ex的值。如下:
具體錯誤:
java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalStateException: No typehandler found for property createDate
解決錯誤
1. 根據第3步斷點處的exception,可以看出來,出錯的是XxxData-mapper.xml文件,其中,屬性createDate需要typehandler;
2. 這意味着typehandler對應的類型,mybatis不支持,需要手動添加typehandler;
分析
1. mybatis是支持Timestamp的,也支持Date,而LocalDateTime是Java8的新特性。
注:其實通過測試已經知道是Timestamp被替換成LocalDateTime造成的問題,找出具體錯誤,只是爲了弄清楚到底爲什麼錯。
解決
1. 直接換成Date即可。(可以)
2. 可以自定義一個TypeHandler,來處理這種情況。(未試)
3. 導入“mybatis-typehandlers-jsr310”包。參考鏈接:http://www.cnblogs.com/carrychan/p/9883293.html(未試)