最近公司一個項目(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 代碼,當然這個需要自己保證代碼是一緻性的,如圖所示

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