mybatis mapper互相引用resultMap啟動出錯的解決
mybatis mapper互相引用resultMap啟動出錯
問題
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for kulink.cvscloud.core.mapper.OrderSundryMapper.BaseResultMap
at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:888) ~[mybatis-3.4.5.jar:3.4.5]
at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:640) ~[mybatis-3.4.5.jar:3.4.5]
at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344) ~[mybatis-3.4.5.jar:3.4.5]... 73 common frames omitted
原因
因為mybatis掃描加載的時候,是按順序加載的A-Z,因為mapperA中引用mapperB中的ResultMap
但是啟動加載的時候mapperB加載在mapperA之后,所以造成mapperB.ResultMap找不到的問題。
解決方法
升級新版本,已經(jīng)解決這個問題了
或者在引用mapper.xml中把resultMap直接復(fù)制過來
mybatis resultMap引發(fā)的吐血bug
簡單的講
問題背景:如果在寫mybatis中的resultMap時,不下心將resultMapde id寫成映射接口的名字,會發(fā)生什么?
結(jié)論:單元測試進(jìn)度條卡住但不報錯, Tomcat運行不報錯,但是不加載項目
以下是詳細(xì)的
需求:從數(shù)據(jù)庫中加載之前插入log日志,打印在某一頁面上。
如:

Java中的pojo:
package pojo;
import java.io.Serializable;
import java.util.Date;
/**
* 系統(tǒng)日志
*
* @author Administrator
*/
public class Log implements Serializable {
private static final long serialVersionUID = -7372303516713218870L;
private int id;//
private int userId;//
private String userName;
private Date createDate;//創(chuàng)建日期
private String content;//日志內(nèi)容
private String operation;//用戶所做的操作
private String url;//用戶所做的操作
public Log() {
}
public Log(int id, int userId, String userName, Date createDate, String content, String operation, String url) {
this.id = id;
this.userId = userId;
this.userName = userName;
this.createDate = createDate;
this.content = content;
this.operation = operation;
this.url = url;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Log{" +
"id=" + id +
", userId=" + userId +
", userName='" + userName + '\'' +
", createDate=" + createDate +
", content='" + content + '\'' +
", operation='" + operation + '\'' +
", url='" + url + '\'' +
'}';
}
}
利用mybatis讀取數(shù)據(jù)時,發(fā)生不可理解的事情

public List<Log> listAll();
<resultMap id="LogMapper" type="Log">
<id column="userid" property="userId"/>
<result column="username" property="userName"/>
<result column="content" property="content"/>
<result column="operation" property="operation"/>
<result column="createdate" property="createDate"/>
<result column="url" property="url"/>
</resultMap>
<select id="listAll" resultMap="LogMapper">
SELECT * FROM t_log
</select>
程序一旦單元測試就會進(jìn)入這樣的狀態(tài),

無限循環(huán),沒有結(jié)束。不僅這個方法,所有的測試方法都進(jìn)入這種“阻塞”的狀態(tài),關(guān)鍵還沒有異常的提示(哭~)不僅如此,重啟tomcat會進(jìn)入這樣


一方面tomcat不再加載項目,同時釋放了幾個看起來像是bug的坑,其實這些都時正常的信息,沒有其他的東西!
期間重新導(dǎo)過jar包,刪除過tomcat,重新部署項目,但只有一添加上述代碼,就會崩潰。最后發(fā)現(xiàn),原來和接口名字重復(fù)了,重復(fù)了。。。。。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java手動實現(xiàn)Redis的LRU緩存機(jī)制
在Java中LRU的實現(xiàn)方式是使用HashMap結(jié)合雙向鏈表,HashMap的值是雙向鏈表的節(jié)點,雙向鏈表的節(jié)點也保存一份key value。2021-05-05
java的新特性反射機(jī)制應(yīng)用及操作示例詳解
這篇文章主要為大家介紹了java的新特性反射機(jī)制的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
SpringBoot?全局線程池配置及應(yīng)用小結(jié)
為了提高應(yīng)用程序的性能和響應(yīng)速度,線程池是一個非常重要的工具,本文主要介紹了Spring?Boot?全局線程池配置及應(yīng)用,具有一定的參考價值,感興趣的可以了解一下2024-05-05

