精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

蜜桃视频成人在线观看| 国产精品无码专区在线观看 | 视频一区二区不卡| 影音先锋日韩有码| 日本少妇xxx| 国产精品专区免费| 亚洲男人的天堂一区二区| 国内外成人免费视频| 伊人22222| 国产综合自拍| 中文字幕日韩欧美在线视频| 黑森林av导航| 久久不卡日韩美女| 午夜久久久久久久久| 亚洲综合网中心| 天堂中文在线官网| 国产专区欧美精品| 97精品国产91久久久久久| 亚洲区一区二区三| 亚洲最大在线| 精品国产乱码久久久久久夜甘婷婷| 成年人观看网站| 亚洲精品天堂| 国产精品蜜臀在线观看| 久久精品日产第一区二区三区精品版 | 亚洲av激情无码专区在线播放| 免费成人av在线| 欧美一区二三区| 欧美日韩中文视频| 欧美777四色影| 色爱av美腿丝袜综合粉嫩av| 熟女少妇一区二区三区| 北条麻妃在线一区二区免费播放| 欧美日韩国产小视频| 国内自拍视频一区| 中文字幕不卡三区视频| 香蕉加勒比综合久久| 8x8x华人在线| 岛国成人毛片| 亚洲色图欧美偷拍| 一本一道久久a久久精品综合 | 国产a级免费视频| 美女久久久精品| 国产精品福利观看| 香蕉影院在线观看| 国产精品三上| 555www成人网| 日产精品久久久| 国产日韩亚洲| 国产91精品青草社区| 日韩美女视频网站| 1024成人| 91国内免费在线视频| 日韩男人的天堂| 伊人蜜桃色噜噜激情综合| 欧美激情三级免费| 精品深夜av无码一区二区老年| 亚洲乱码精品| 久久69精品久久久久久久电影好| 国产这里有精品| 国产精品v日韩精品v欧美精品网站| 欧美www在线| 亚洲欧美一区二区三区四区五区| 一区二区电影| 欧美精品激情在线| 天天操天天干视频| 视频一区视频二区中文| 国产精品久久久久久av下载红粉| 日韩国产成人在线| 美日韩一级片在线观看| 91久久久久久久久| 亚洲乱码精品久久久久..| 国产成人免费网站| 精品免费国产| 激情福利在线| 国产精品久久久久影院老司| 天天干天天操天天干天天操| 伊人春色在线观看| 亚洲成人www| 国产一区二区视频免费在线观看| 成人综合网站| 欧美不卡一区二区三区| 蜜桃精品成人影片| 日本一区二区高清不卡| 欧美黄色片在线观看| 久久国产乱子伦精品| 激情综合网最新| 国产在线资源一区| 91九色在线porn| 夜夜爽夜夜爽精品视频| 欧美激情国产精品日韩| 99国内精品久久久久| 亚洲国产精品久久精品怡红院| 日韩精品无码一区二区三区久久久 | 亚洲女人天堂色在线7777| 中文字幕人妻一区二区三区在线视频| 亚洲成人精品| 777国产偷窥盗摄精品视频| 日韩乱码一区二区三区| 国产成人亚洲综合a∨猫咪| 欧美视频1区| 成人短视频在线| 欧美视频精品一区| 无码人妻久久一区二区三区蜜桃| 精品视频99| 羞羞色国产精品| 91福利在线观看视频| 99久久精品国产网站| 欧美日韩在线免费观看视频| 日本在线播放一二三区| 欧美一区二区视频在线观看2020| 久久久久亚洲av成人无码电影| 亚洲网色网站| 国产精品免费看久久久香蕉| 欧美亚洲精品在线观看| 亚洲精选一二三| 亚洲人成色77777| 另类尿喷潮videofree| 久久久精品久久久久| 在线视频精品免费| 99精品久久99久久久久| 九九久久九九久久| 日韩三区四区| 中文字幕国产精品| 国产99免费视频| www久久精品| 欧美一级视频在线播放| 亚洲超碰在线观看| 久久久精品久久久久| 自拍偷拍精品视频| 国产欧美一二三区| 国产精品乱码久久久久| 丝袜久久网站| 欧美亚洲另类在线| 污视频在线免费观看| 亚洲国产精品久久一线不卡| 在线免费黄色小视频| 国产精品久久久久无码av| 国产精品久久婷婷六月丁香| 国产在线高清| 色婷婷亚洲一区二区三区| aa一级黄色片| 久久久成人网| 欧美日韩一区二区三区在线视频| 色偷偷色偷偷色偷偷在线视频| 亚洲激情视频网| 日韩欧美三级在线观看| 99精品在线免费| 国产h视频在线播放| 精品成人自拍视频| …久久精品99久久香蕉国产| 天天色综合av| 色综合亚洲欧洲| 丰腴饱满的极品熟妇| 老司机免费视频久久| 欧洲一区二区在线观看| 91p九色成人| 俺去了亚洲欧美日韩| 国产suv一区二区| 一二三区精品福利视频| 激情综合丁香五月| 中文在线一区| 日韩动漫在线观看| 亚洲欧美专区| 欧美激情国产精品| 亚洲色大成网站www| 色妞www精品视频| av免费播放网站| 国产一区二区不卡| 国产资源在线免费观看| 免费成人网www| 国产精品亚洲аv天堂网| 成人日韩欧美| 亚洲国产精品电影在线观看| 久久精品视频2| 亚洲欧洲日本在线| 精品人妻在线视频| 天堂va蜜桃一区二区三区漫画版| 一区在线电影| 136福利精品导航| 奇门遁甲1982国语版免费观看高清| 午夜在线小视频| 欧美videos中文字幕| 五月天激情四射| 亚洲精品少妇30p| 久久精品国产亚洲av麻豆| 秋霞av亚洲一区二区三| 97中文字幕在线| 欧美美女视频| 精品国产乱码久久久久久久软件| 成人精品动漫| 久久全球大尺度高清视频| www.久久热.com| 亚洲第一av网| 一道本在线视频| 欧美日韩精品在线播放| 日本美女黄色一级片| 成人白浆超碰人人人人| 国产色视频在线播放| 99香蕉国产精品偷在线观看| 国产对白在线播放| 国产精品探花在线观看| 国产 高清 精品 在线 a| 91p九色成人| 国产91精品青草社区| 在线观看电影av| 在线激情影院一区| 飘雪影院手机免费高清版在线观看| 欧美一区二区日韩| 中文精品久久久久人妻不卡| 亚洲成人av免费| 欧美成人国产精品高潮| 中文字幕欧美三区| 亚洲欧美视频在线播放| 国产福利一区二区| 亚洲成人天堂网| 久久久久久久欧美精品| 男女私大尺度视频| 欧美福利在线| 中文字幕日韩一区二区三区| 国产一区日韩| 鲁片一区二区三区| 久久九九热re6这里有精品| 91网站在线免费观看| 成人性片免费| 国产精品一区二区性色av| 国产精欧美一区二区三区蓝颜男同| 久久久久久美女| 欧美草逼视频| 美女福利精品视频| 二区三区在线观看| 免费av一区二区| 宅男在线观看免费高清网站| 久久九九国产精品怡红院| 午夜免费福利在线观看| 一区二区亚洲精品国产| 国产一级免费在线观看| 亚洲网站视频福利| 黄色在线网站| 一个人www欧美| 都市激情一区| 在线性视频日韩欧美| 国产最新视频在线观看| 亚洲色图15p| 国产成人天天5g影院在线观看| 亚洲无线码在线一区观看| 国产黄在线观看免费观看不卡| 亚洲热线99精品视频| 狠狠v欧美ⅴ日韩v亚洲v大胸| 亚洲女人天堂视频| www.亚洲免费| 草民午夜欧美限制a级福利片| 超碰在线免费播放| 欧美激情一二三| 久草在线资源福利站| 国产成人精品久久| 成人交换视频| 91深夜福利视频| 成人av地址| 久久久久久国产精品免费免费| 九九亚洲视频| 中文字幕一区二区中文字幕| 欧美日本三区| 波多野结衣乳巨码无在线| 午夜亚洲激情| 国内国产精品天干天干| 国产成人在线免费观看| 手机在线看片日韩| 欧美激情在线观看视频免费| 国产大片免费看| 精品国产1区2区| 最好看的日本字幕mv视频大全| 欧美高清dvd| 国产91免费看| 国产亚洲精品久久久优势| 国产网站在线免费观看| 97超级碰碰人国产在线观看| 99久久精品一区二区成人| 97超碰人人模人人爽人人看| 全国精品免费看| 一区在线电影| 国产亚洲亚洲| mm131国产精品| 成人av资源在线观看| 日本精品在线观看视频| 亚洲一区二区在线观看视频 | 免费成人你懂的| 国产伦精品一区二区三区妓女下载 | 97蜜桃久久| 国产精品免费视频xxxx| 国产伦理久久久久久妇女| 视频一区在线免费观看| 伊人影院久久| av亚洲天堂网| 91麻豆精品秘密| 亚洲av鲁丝一区二区三区| 色婷婷综合久久久久中文| www.四虎在线观看| 中文字幕9999| 国产精品一二三产区| 91美女片黄在线观| 极品美女一区二区三区| 日本一本中文字幕| 国产一区二区免费视频| 欧美人妻一区二区三区| 精品国产乱码久久久久久虫虫漫画| 一本一道人人妻人人妻αv | 免费av在线| 国产成+人+综合+亚洲欧美丁香花| 2020国产精品极品色在线观看| 翔田千里亚洲一二三区| 国产一级久久| 大尺度做爰床戏呻吟舒畅| ...中文天堂在线一区| 亚洲永久精品一区| 亚洲欧美精品一区二区| 黄色软件视频在线观看| 国产精品久久久久久久久久直播| 婷婷综合伊人| 中文字幕av专区| 国产三级精品视频| 秋霞精品一区二区三区| 日韩精品中文字幕在线观看| 丁香高清在线观看完整电影视频| 91美女高潮出水| 婷婷亚洲五月色综合| 超碰在线播放91| 国产精品蜜臀av| 亚洲无码久久久久| 在线观看亚洲区| 国产成人毛片| 一区二区三区欧美成人| 奇米影视一区二区三区小说| 天天躁夜夜躁狠狠是什么心态| 色美美综合视频| wwwww在线观看免费视频| 国产精品久久久久久久久久小说| 亚洲aa在线| 国产精品亚洲a| 久久久精品一品道一区| 免费看日批视频| 亚洲天堂av在线免费观看| 日韩三级影视| 日韩在线电影一区| 蜜桃精品在线观看| 国产日产在线观看| 欧美日韩精品福利| 99在线视频观看| 高清国产在线一区| 亚洲精品字幕| 草草影院第一页| 欧美日韩免费一区二区三区| 久久99精品久久| 97人人模人人爽人人少妇| 亚洲人成毛片在线播放女女| 182在线视频| 日本韩国精品在线| 99中文字幕一区| 2014亚洲精品| 中文高清一区| 亚洲精品国产精品国自产网站| 欧美精品乱码久久久久久按摩| a黄色片在线观看| 激情视频在线观看一区二区三区| 性色一区二区| 欧美日韩生活片| 日韩精品最新网址| 亚洲欧美小说色综合小说一区| 日韩国产精品一区二区| 激情综合色播激情啊| 久久久久久天堂| 亚洲欧美中文日韩在线v日本| 成人一级视频| 免费拍拍拍网站| 久久久精品一品道一区| 国产精品久久无码一三区| 欧美激情xxxx性bbbb| 国产一区二区精品久| 欧美午夜精品理论片| 同产精品九九九| 在线观看精品一区二区三区| 成人区精品一区二区| 久久久久国产精品一区三寸| 欧美色图亚洲天堂| 亚洲欧美一区二区精品久久久| 国产麻豆精品| www.四虎成人| 亚洲综合免费观看高清完整版在线| 免费在线高清av| 666精品在线| 日韩电影免费在线观看网站| 欧美国产在线看| 国产一区二区三区精品久久久| 午夜日韩影院| 成年人小视频网站| 亚洲影院理伦片| 黄色动漫在线| 欧美一区国产一区| 丁香婷婷综合激情五月色| 91国产精品一区|