精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

盤點 Mybatis 使用過程中遇到的坑!

開發 前端
springframework包下的@Param注解執行時機在wrapCollection處理之前,wrapCollection對集合的特殊處理將springframework包下的@Param注解處理覆蓋掉了,所以無法解析參數set。而mybatis包下的@Param注解執行時機在wrapCollection處理之后,程序可以正常運行。

01、引言

大家好,我是了不起,前一段時間在工作中因為一個疏忽踩了一個坑,最終通過異常棧追溯源碼解決了問題。

下面我來給大家還原一下案發現場,并介紹一下自己的解決思路,希望能對大家有所啟發。

02、案發現場

當時的業務邏輯主要通過 Mybatis 框架來修改數據,具體示例如下:

import org.springframework.data.repository.query.Param;

public interface GroupMapper {
 
 int updateGroup(@Param("oldSerial") Set<Integer> oldSerial, @Param("newSerial") int newSerial);

 int invalidGroup(@Param("set") Set<Integer> set);
}
<update id="updateGroup">
    update groupCode_table_use
    set groupCode=#{newSerial}
    where groupCode in
    <foreach collection="oldSerial" close=")" open="(" item="item" separator=",">
        #{item}
    </foreach>
</update>

<update id="invalidGroup">
    update groupCode_table
    set status='無效'
    where groupCode in
    <foreach collection="set" close=")" open="(" item="item" separator=",">
        #{item}
    </foreach>
</update>

本以為 so easy 的代碼,出現意外了!第一個sql語句updateGroup正常運行,第二個sql語句invalidGroup竟然報錯了???

報錯信息如下:

圖片圖片

從日志上可以看出,提示set參數找不到!

明明使用了@Param("set")將參數命名為set為何找不到,完全不符合多年開發的認知。

更加詭異的是updateGroup已使用了同樣的方式去遍歷,完全沒得問題,那么問題出現在了哪了?

小伙伴可以先猜一猜!

03、原因分析

百思不得其解下,我掏出了祖傳絕活 debug 源碼,最終發現原來是Mybatis對集合Set進行了特殊處理。

案發項目引入的Mybatis版本是 3.5.1。部分源碼如下!

org.apache.ibatis.session.defaults.DefaultSqlSession.java

@Override
public int update(String statement, Object parameter) {
  try {
    dirty = true;
    MappedStatement ms = configuration.getMappedStatement(statement);
    //調用了wrapCollection方法對參數進行了處理
    return executor.update(ms, wrapCollection(parameter));
  } catch (Exception e) {
    throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
  } finally {
    ErrorContext.instance().reset();
  }
}

/**
* 如果參數實現了Collection接口或是數組類型 wrapCollection方法會對參數進行封裝
* 如果參數實現了Collection接口會封裝為含collection鍵的Map
*     如果參數又實現了List接口會封裝為含list鍵的Map(追增)
*     對Set集合沒有特殊處理
* 如果參數是數組類型會封裝為含array鍵的Map
*/
private Object wrapCollection(final Object object) {
  if (object instanceof Collection) {
    StrictMap<Object> map = new StrictMap<>();
    map.put("collection", object);
    if (object instanceof List) {
      map.put("list", object);
    }
    return map;
  } else if (object != null && object.getClass().isArray()) {
    StrictMap<Object> map = new StrictMap<>();
    map.put("array", object);
    return map;
  }
  return object;
}

通過以上的源碼分析,發現Mybatis框架對集合參數進行了特殊處理。

這就是為什么報錯信息中提示Available parameters are [collection]。

找到了collection錯誤信息從哪里來問題,接下來我們分析一下set參數到了哪里去。

首先updateGroup可以正常執行是因為源碼中對集合的特殊處理只對單參數生效,也就是說@Param("set")注解失效是因為被Mybatis自家的特殊處理給覆蓋了?

這不合乎常理啊,那么問題可能出在@Param注解身上,通過排查代碼發現GroupMapper.java類引用的@Param注解不對!

// 代碼引入的注解類Param
import org.springframework.data.repository.query.Param;
// 期望的注解類,應該由mybatis提供
import org.apache.ibatis.annotations.Param;

實際上,springframework包下的@Param注解執行時機在wrapCollection處理之前,wrapCollection對集合的特殊處理將springframework包下的@Param注解處理覆蓋掉了,所以無法解析參數set。而mybatis包下的@Param注解執行時機在wrapCollection處理之后,程序可以正常運行。

最終確定,繞了這么大一圈,原來是包導入錯了,誰能想到springframework包下還有一個@Param注解,在多參數的情況下竟然可以正常使用o(╥﹏╥)o。

04、異常棧分析法

整個異常排查過程中,主要通過分析異常棧信息進行快速定位。下面我給大家介紹一下異常棧分析法。

我們在工作中查看異常棧,往往都是業務代碼異常導致的,這個時候我們只需要關心是在我們編寫的哪段代碼中出了問題。

而這時好用的idea也會為溫馨的為我們做出提示,會在異常棧中將我們編寫的方法位置信息標藍處理,這樣我們就定快速定位出現問題的代碼。

圖片圖片

但是一旦是底層引用的jar包出現了異常,僅僅是這樣查看異常棧是不夠的。下面我們就以上面案例中的異常棧來帶大家分析。

當前異常:

圖片圖片

原始異常:

圖片圖片

分析流程:

  • 異常調用棧順序:從上至下為方法調用順序的逆序,異常由異常棧的最上面的方法拋出,整個調用的入口在最下方。
  • 尋找原始異常入口技巧:檢索異常棧中與原始異常入口(最下面)拋出位置同名的方法。
  • 尋找真正異常出現的位置,要找最后一個 Caused by 的第一行棧幀。


"Caused by" 是 Java 異常處理機制中的一部分,它表示當前異常是由另一個異常引起的。在 Java 中,每個 Throwable 對象都可以通過 getCause() 方法獲取到原始異常,這個原始異常就是通過 "Caused by" 打印出來的。

異常棧示例代碼:

假設你在catch塊中捕獲了一個異常,并重新拋出了一個新的異常,同時保留了原始異常的信息:

public class Example {
    public static void main(String[] args) {
        try {
            methodThatThrowsException();
        } catch (Exception e) {
            throw new RuntimeException("Caught an exception", e);
        }
    }

    public static void methodThatThrowsException() throws Exception {
        throw new Exception("Original exception");
    }
}

當你運行上述代碼時,控制臺輸出的異常棧信息通常會包含Caused by信息:

java.lang.RuntimeException: Caught an exception
    at Example.main(Example.java:7)
Caused by: java.lang.Exception: Original exception
    at Example.methodThatThrowsException(Example.java:12)
    at Example.main(Example.java:5)
  • java.lang.Exception: Original exception 是原始異常。
  • java.lang.RuntimeException: Caught an exception 是新拋出的異常,并且包含了原始異常作為其原因。
  • Caused by 信息顯示了原始異常的詳細信息,這有助于調試和理解異常的來源。

如何保留原始異常信息呢?

  • 方式一:直接傳遞原始異常:
try {
     methodThatThrowsException();
 } catch (Exception e) {
     throw new RuntimeException("Caught an exception", e);
 }
  • 方式二:使用 addSuppressed 方法:
try {
     methodThatThrowsException();
 } catch (Exception e) {
     RuntimeException newException = new RuntimeException("Caught an exception");
     newException.addSuppressed(e);
     throw newException;
 }

05、結語

學會查看分析異常棧,可以為我們工作大大提高效率,希望這篇文章給大家帶來收獲,最后再送給大家一個小技巧。異常棧不僅僅可以用來排查異常哦,還可以幫助大家學習源碼,debug 源碼找不到入口怎么辦,那就創造一個異常!

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2016-03-23 11:03:40

2020-07-29 08:03:26

Celery異步項目

2010-06-07 16:51:06

rsync 使用

2011-04-13 13:54:03

HttpClient

2011-03-04 13:49:38

FileZilla

2009-12-29 14:14:22

2022-02-07 00:10:28

Docker容器開發

2023-02-28 16:26:46

推薦系統模塊

2009-11-02 08:56:17

2024-09-09 09:08:28

2016-12-30 11:10:32

Hadoop開發JVM

2021-11-15 15:43:28

Windows 11升級微軟

2019-10-28 14:07:29

研發管理技術

2012-07-26 10:10:27

虛擬化安全網絡安全

2012-07-27 10:01:13

虛擬化

2010-03-15 09:11:25

Python編程版面

2010-05-11 18:05:50

MySQL 5安裝

2022-11-18 09:27:22

數據庫

2009-12-10 14:19:41

配置靜態路由

2020-03-16 13:16:48

Kubernetes選型踩坑
點贊
收藏

51CTO技術棧公眾號

亚洲巨乳在线观看| 欧美专区在线视频| 日日噜噜夜夜狠狠| 欧美jizz18hd性欧美| 久久福利资源站| 少妇高潮 亚洲精品| av在线网站免费观看| 青青青草视频在线| 久久在线免费观看| 国产日韩在线视频| 久久黄色免费网站| 要久久电视剧全集免费| 欧美日免费三级在线| 中文字幕中文字幕在线中心一区 | 夜夜夜夜夜夜操| 国产一二三区在线观看| 岛国av在线一区| 欧美在线视频网站| 亚洲女人毛茸茸高潮| 香蕉成人app| 日韩欧美在线视频观看| 一区二区三区四区免费视频| av综合在线观看| 国产精品毛片在线| 日韩中文在线视频| 久草视频福利在线| 国产精品久久乐| 亚洲品质自拍视频网站| 麻豆精品传媒视频| 国产99久一区二区三区a片| 国产精品美女久久久| 日韩中文字幕视频在线观看| 手机在线成人av| 日韩黄色三级| 一本到不卡精品视频在线观看| 制服丝袜综合日韩欧美| 天天av综合网| 精品一区二区免费| 欧美最猛黑人xxxx黑人猛叫黄| 日韩三级久久久| 偷拍自拍一区| 日韩免费成人网| 91高清国产视频| 涩涩视频在线| 一区二区三区资源| 一区二区三区四区免费视频| 免费人成在线观看网站| 丁香六月综合激情| 亚洲bt欧美bt日本bt| 国产99久久久久久免费看| 国产精品红桃| 久久不射电影网| www中文在线| 精品99在线| 日韩电影在线观看中文字幕| 亚洲欧洲日韩综合| 毛片免费看不卡网站| 亚洲国产综合视频在线观看| 丰满女人性猛交| 激情小说 在线视频| aaa国产一区| www.久久爱.cn| 国产jzjzjz丝袜老师水多| 久久精品免费观看| 成人性生交大片免费看小说| 中文字幕精品一区二| 水蜜桃久久夜色精品一区的特点| 午夜精品一区二区三区视频免费看| 加勒比婷婷色综合久久| 欧美疯狂party性派对| 最近免费中文字幕视频2019| 亚洲国产天堂av| 国产精品嫩模av在线| 亚洲欧美日本精品| 成年人免费观看视频网站 | 久久久久综合一区二区三区| 亚洲精品久久久久久无码色欲四季 | 精品三级在线观看| 欧美图片自拍偷拍| 成人爽a毛片| 亚洲经典中文字幕| www.久久国产| 成人三级视频| xvideos成人免费中文版| 中文字幕无码日韩专区免费 | 香蕉久久夜色| 国产日产一区二区| 亚洲一区免费在线观看| 日本午夜激情视频| 欧美日韩美女| 欧美久久久久久久久久| 成人免费黄色av| 国产精品高潮呻吟久久久久| 日韩电视剧在线观看免费网站| 亚洲制服丝袜在线播放| 图片婷婷一区| 日韩中文字幕亚洲| 中文字幕第28页| 久久精品九九| 91久久久久久国产精品| 亚洲精品久久久狠狠狠爱| 99re热这里只有精品视频| 国产欧美综合精品一区二区| 青青草娱乐在线| 国产蜜臀av在线一区二区三区| 一区二区在线观看网站| 欧美家庭影院| 91久久精品一区二区二区| 尤物网站在线看| 国产66精品| 尤物yw午夜国产精品视频明星| 成年人免费视频播放| 午夜欧美精品| 国产91色在线免费| 国产婷婷一区二区三区久久| 972aa.com艺术欧美| 亚洲免费久久| 日本黄色免费在线| 欧美人成免费网站| 国产 xxxx| 国产一区二区三区四区大秀| 欧美成人精品一区二区三区| 久久国产黄色片| 国产麻豆精品视频| 欧美自拍资源在线| 日韩伦理电影网站| 欧美在线不卡一区| 成人在线视频免费播放| 国产精品久久天天影视| 97超级碰碰碰| 一本久道久久综合无码中文| 99在线热播精品免费| 在线一区亚洲| 吞精囗交69激情欧美| 欧美刺激午夜性久久久久久久| 亚洲 小说 欧美 激情 另类| 亚洲电影av| 99久久久久久| 国产免费一区二区| 特级毛片在线| 欧美日韩国产小视频| 久久一区二区电影| 国内自拍视频一区二区三区| 成人乱人伦精品视频在线观看| 亚洲欧美自偷自拍| 亚洲欧美精品午睡沙发| 天天操狠狠操夜夜操| 国产免费久久| 日本欧美在线视频| 深夜福利视频在线免费观看| 亚洲欧洲精品一区二区三区| 久久久国产欧美| 国产精品毛片av| 欧美国产日韩一区二区三区| 国产精品一区二区免费视频| 欧美韩日一区二区三区四区| 干日本少妇首页| 麻豆视频一区| 91精品国产91| 神马午夜精品95| 午夜精品aaa| 999这里有精品| 欧美残忍xxxx极端| 国产日韩在线视频| 黄网站视频在线观看| 欧美美女网站色| 日韩一区二区三区四区在线| 激情综合五月天| 玖玖精品在线视频| 一区二区三区四区精品视频| 久久亚洲精品中文字幕冲田杏梨| 国产美女裸体无遮挡免费视频| 亚洲欧美在线视频| av在线网站免费观看| 欧美日韩亚洲一区在线观看| 91久久久一线二线三线品牌| 国产原创视频在线观看| 欧美三级蜜桃2在线观看| 久久精品无码一区| 日韩av电影天堂| 在线不卡日本| 亚洲国产视频二区| **欧美日韩vr在线| 国产对白叫床清晰在线播放| 91精品国产综合久久久久久| 日产欧产va高清| 国产精品亲子伦对白| 乳色吐息在线观看| 久久精品系列| 国产91视频一区| 国产精品一线天粉嫩av| 亚洲free性xxxx护士白浆| 竹内纱里奈兽皇系列在线观看 | 撸视在线观看免费视频| 91精品国产全国免费观看| 性无码专区无码| 亚洲色图制服丝袜| 亚洲激情视频小说| 激情综合网最新| 久久久999视频| 国产精品毛片久久| 久久影院理伦片| 色妞ww精品视频7777| 欧美自拍视频在线观看| 色噜噜狠狠狠综合欧洲色8| 亚洲少妇中文在线| 亚洲AV午夜精品| 欧美男人的天堂一二区| 国产乱国产乱老熟| 一个色妞综合视频在线观看| 黑人と日本人の交わりビデオ| av成人动漫在线观看| 亚洲精品视频三区| 日韩黄色片在线观看| www.射射射| 午夜精品久久久久99热蜜桃导演| 日本在线播放不卡| 欧洲亚洲成人| 岛国视频一区| 欧美日本三级| 国产在线久久久| 久久国内精品| 国产成人综合亚洲| 中国色在线日|韩| 韩国日本不卡在线| 成人性生交大片免费看在线播放| 日韩三级成人av网| 在线免费av电影| 中文字幕日韩有码| 国产一级二级三级在线观看| 日韩精品中文字幕视频在线| 亚洲第一免费视频| 日韩一区二区免费视频| 91午夜交换视频| 欧美视频三区在线播放| 中文字幕在线观看视频免费| 婷婷国产在线综合| 日本在线视频免费观看| 亚洲成人动漫在线观看| 久久久久久久久久久久久久免费看 | 国产精品一区亚洲| 波多野结衣之无限发射| 亚洲日韩视频| 黄色大片中文字幕| 亚洲乱码久久| 国产99久久九九精品无码| 亚洲美女网站| 国产又黄又大又粗视频| 久久高清国产| 欧美精品aaaa| 久久国产乱子精品免费女| 色噜噜狠狠永久免费| 麻豆国产精品官网| 久久成年人网站| 国产麻豆成人传媒免费观看| 亚洲一级片免费观看| 丁香天五香天堂综合| 在线视频 日韩| 久久亚洲私人国产精品va媚药| 蜜桃av免费看| 国产精品天干天干在观线| 搜索黄色一级片| 亚洲午夜在线观看视频在线| 日本亚洲欧美在线| 一本到不卡免费一区二区| 免费看av在线| 51精品国自产在线| 天堂在线视频免费| 亚洲天堂一区二区三区| 黄色av电影在线播放| 欧美国产日韩一区二区在线观看 | 国产精品嫩草视频| 日韩精品久久久久久久软件91| 91探花福利精品国产自产在线| 亚洲午夜精品| 日本午夜精品一区二区三区| 色97色成人| 日本熟妇人妻xxxx| 久久一区二区三区超碰国产精品| 国产九九热视频| 成人精品免费视频| 久久亚洲AV无码专区成人国产| 中文字幕一区二区三区蜜月| 中文字幕第28页| 欧美日韩一级视频| 欧美一级特黄aaaaaa大片在线观看| 精品视频中文字幕| 欧美jizz18性欧美| 45www国产精品网站| 亚洲成人毛片| 蜜桃导航-精品导航| 综合视频在线| 久久久久久香蕉| 国产激情一区二区三区桃花岛亚洲 | 激情综合五月| 欧洲视频一区二区三区| 亚洲精品国产首次亮相| 97超碰青青草| 国产激情91久久精品导航 | 日韩av电影手机在线观看| 亚洲精品成a人ⅴ香蕉片| 精品久久久久久乱码天堂| 色婷婷色综合| 日日摸日日碰夜夜爽av| 国产福利精品导航| 91大神福利视频| 亚洲444eee在线观看| 国产精品-色哟哟| 亚洲日本欧美中文幕| 成人性生交大片免费看网站| 国产精品一区二区三区毛片淫片| 免费成人蒂法| 精品人妻人人做人人爽| 毛片av一区二区| 精品欧美一区二区久久久| 午夜精品国产更新| 午夜精品久久久久久久99| 色悠悠久久久久| jizz欧美| 欧美重口乱码一区二区| 国产精品社区| www.555国产精品免费| 亚洲狼人国产精品| 国产精品女人久久久| 这里只有精品视频在线| 欧美艳星kaydenkross| 精品国产乱码久久久久久郑州公司| 亚洲成人三区| 国产女同无遮挡互慰高潮91| 欧美激情一区二区三区不卡| 亚洲国产av一区二区三区| 精品中文字幕久久久久久| heyzo一区| 国产精品区二区三区日本| 国产一区二区三区自拍| 91亚洲一区二区| 亚洲色欲色欲www| 国产三级精品在线观看| 北条麻妃一区二区三区中文字幕 | 国产91丝袜美女在线播放| 欧美色xxxx| 人操人视频在线观看| 538国产精品一区二区在线| 日韩欧美国产大片| 黑人糟蹋人妻hd中文字幕| 91在线精品一区二区| 国产免费av一区| 亚洲石原莉奈一区二区在线观看| a日韩av网址| 日韩亚洲视频在线| 蜜桃久久av一区| 黑人狂躁日本娇小| 欧美一三区三区四区免费在线看| 国产黄色小视频在线| 999视频在线免费观看| 狠狠色丁香久久综合频道| 中国极品少妇xxxx| 精品久久在线播放| 国自产拍在线网站网址视频| 国产精品欧美日韩| 一本一道久久a久久精品蜜桃| 熟妇女人妻丰满少妇中文字幕| 亚洲一区二区三区四区五区黄 | 国产三区在线播放| 欧美激情精品久久久久久久变态| 大型av综合网站| 欧美日韩一区二区在线免费观看 | 久青草免费视频| 日韩成人中文电影| 韩日精品一区| 精品国产一区二区三区在线| 成人av一区二区三区| 在线观看免费av片| 色777狠狠综合秋免鲁丝| 久久伦理中文字幕| av免费观看网| 国产精品美女久久久久久久| jlzzjlzzjlzz亚洲人| 2024亚洲男人天堂| 天天射综合网视频| 给我免费观看片在线电影的| 91成人网在线| 午夜小视频在线观看| 久久99国产精品99久久| 奇米色777欧美一区二区| 美女视频黄免费| 一本一本久久a久久精品牛牛影视| 视频91a欧美| 波多野结衣乳巨码无在线| 国产精品福利一区二区三区| 亚洲欧美激情国产综合久久久| 国产91在线播放九色快色| 午夜欧美视频| 日本午夜精品视频| 亚洲第一精品夜夜躁人人爽| 岛国精品在线| 北条麻妃在线视频观看| 亚洲视频资源在线| 成年人视频在线观看免费| 国产成人精品一区二区三区福利|