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找不到的問題。
解決方法
升級新版本,已經解決這個問題瞭
或者在引用mapper.xml中把resultMap直接復制過來
mybatis resultMap引發的吐血bug
簡單的講
問題背景:如果在寫mybatis中的resultMap時,不下心將resultMapde id寫成映射接口的名字,會發生什麼?
結論:單元測試進度條卡住但不報錯, Tomcat運行不報錯,但是不加載項目
以下是詳細的
需求:從數據庫中加載之前插入log日志,打印在某一頁面上。
如:
Java中的pojo:
package pojo; import java.io.Serializable; import java.util.Date; /** * 系統日志 * * @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;//創建日期 private String content;//日志內容 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讀取數據時,發生不可理解的事情
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>
程序一旦單元測試就會進入這樣的狀態,
無限循環,沒有結束。不僅這個方法,所有的測試方法都進入這種“阻塞”的狀態,關鍵還沒有異常的提示(哭~)不僅如此,重啟tomcat會進入這樣
一方面tomcat不再加載項目,同時釋放瞭幾個看起來像是bug的坑,其實這些都時正常的信息,沒有其他的東西!
期間重新導過jar包,刪除過tomcat,重新部署項目,但隻有一添加上述代碼,就會崩潰。最後發現,原來和接口名字重復瞭,重復瞭。。。。。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- mybatis映射和實際類型不一致的問題
- 解決resultMap映射數據錯誤的問題
- Mybatis中resultMap標簽和sql標簽的設置方式
- MyBatis多表操作查詢功能
- 解讀Mapper與Mapper.xml文件之間匹配的問題