天天看點

IntelliJ IDEA - 如何找到 Class 檔案的 Java 源碼檔案進行 Debug?

最近公司一個項目(T)需要整合另外 2 個項目(A、B)的內建,于是,我們的方案是打包A、B成 jar,然後 deploy 到中央倉庫,再用 T 去拉 maven pom,但是發現一個問題,debug T 項目的時候裡面都是 class 檔案(正常),大家都知道,調試 class 檔案反編譯的結果和原生 java 代碼可能是有出入的,舉個例子……

Java 檔案

public RequestInterceptor requestInterceptor() {
    return template -> {
        // 從父線程中擷取 request,避免子線程開啟時候丢失了父 request
        if (Objects.isNull(RequestContextHolder.getRequestAttributes()) || RequestContextHolder.getRequestAttributes() instanceof NonWebRequestAttributes) {
            RequestContextHolder.setRequestAttributes(nonWebRequestAttributes, Boolean.TRUE);
            HttpServletRequest request = this.getHttpServletRequestSafely();
            if (null != request && null != request.getAttribute("X-Request-No")) {
                template.header("X-Request-No", request.getAttribute("X-Request-No").toString());
            }
            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
            template.header("x-tenant-id", nonWebRequestAttributes.getTenantId());
        } else {
            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            if (null != attributes) {
                HttpServletRequest request = attributes.getRequest();
                Enumeration<String> headerNames = request.getHeaderNames();
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        String name = headerNames.nextElement();
                        String value = request.getHeader(name);
                        // 一定要去掉 content-length 否則跟自己feign調用時傳參字元數會對不上而報錯
                        if (name.equalsIgnoreCase("x-tenant-id")) {
                            template.header(name, value);
                        }
                    }
                }
            }
        }
    };
}      

Class 檔案

public RequestInterceptor requestInterceptor() {
    return (template) -> {
        if (!Objects.isNull(RequestContextHolder.getRequestAttributes()) && !(RequestContextHolder.getRequestAttributes() instanceof NonWebRequestAttributes)) {
            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
            ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
            if (null != attributes) {
                HttpServletRequest requestx = attributes.getRequest();
                Enumeration<String> headerNames = requestx.getHeaderNames();
                if (headerNames != null) {
                    while(headerNames.hasMoreElements()) {
                        String name = (String)headerNames.nextElement();
                        String value = requestx.getHeader(name);
                        if (name.equalsIgnoreCase("x-tenant-id")) {
                            template.header(name, new String[]{value});
                        }
                    }
                }
            }
        } else {
            RequestContextHolder.setRequestAttributes(this.nonWebRequestAttributes, Boolean.TRUE);
            HttpServletRequest request = this.getHttpServletRequestSafely();
            if (null != request && null != request.getAttribute("X-Request-No")) {
                template.header("X-Request-No", new String[]{request.getAttribute("X-Request-No").toString()});
            }

            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
            template.header("x-tenant-id", new String[]{this.nonWebRequestAttributes.getTenantId()});
        }

    };
}      

發現問題

  • 發現了嗎,在第一個 if 語句裡是不一樣的,這也還好,關鍵是有時候 debug 邏輯是錯亂的,比如我遇到過一次調試這個 class 檔案,從 else 的邏輯走完,居然跑到了第一個 if 語句裡面的第三行邏輯,簡直一臉懵的狀态~但是當時 deploy 上去也沒所謂的 java 源碼,那怎麼辦呢?

解決方案

其實發現可以手動的去關聯 java 代碼,當然這個需要自己保證代碼是一緻性的,如圖所示

IntelliJ IDEA - 如何找到 Class 檔案的 Java 源碼檔案進行 Debug?

點選箭頭的地方,彈出一個視窗,進行代碼關聯,當然這裡有一個小技巧,不需要精準定位到具體哪個 java 檔案,隻要選擇在其範圍的包,IDEA會自動搜尋該對應的檔案,還是很友善的噢~

IntelliJ IDEA - 如何找到 Class 檔案的 Java 源碼檔案進行 Debug?

提示找到該檔案,點選 OK 即可!