解決JHipster Register5.x不能正確解析uaa的api docs的問題

最近在家,無法出門,研究分佈式系統的架構。主要使用JHipster構建,而其中最關鍵的就是註冊中心。github上面已經更新到6.1.1的版本,二我們上次使用的版本是3.2.4,我決定研究5.x的版本,於是拉取來5.0.0的源碼進行修改、構建、部署、測試。但是在測試過程中遇到一個問題,就是3.x和4.x版本的註冊中心都能正確解析uaa的接口文檔,但是5.x和6.x都不行,一直有以下提示

401 : {"error":"invalid_token","error_description":"Cannot convert access token to JSON","basePath":"/services/uaa/uaa:c1266900a5f688968eec45ff2be4872f"} http://localhost:8761/services/uaa/uaa:c1266900a5f688968eec45ff2be4872f/v2/api-docs

雖然接口文檔在swagger中不能正常顯示並不影響服務的使用,但是看着很不舒服,團隊開發也不方便,更重要的是,我有強迫症,遇到問題總要把它解決掉。但是要去完整研究JHipster Registry的源代碼那就有點恐怖了,畢竟我還有其他事兒要做。本來就決定乾脆就以4.x這個版本做就好來,轉念一想,爲什麼4.x可以而5.x不行?網上查找資料什麼tokenstore也沒有,轉換器也沒有找到。已經兩天了,剛準備放棄,忽然想到不如對比一下日誌和兩種版本的源代碼。結果令人驚喜,我分別用兩種版本的註冊中心來管理uaa,在切換api docs的時候清空日誌觀察,將線索定位在了service包下面的ZuulUpdaterService類,比較行數發現差一行,而這一行是在5.x這一版裏面多import來一個類import java.util.Collections;追蹤查找,在兩個版本此類的61行上下,構建一個ZuulRouteDTO對象時,找到了不同之處;

4.x

ZuulRouteDTO route = new ZuulRouteDTO(instanceId, "/" +
                    application.getName().toLowerCase() + "/" + instanceId + "/**",
                    null, url, zuulProperties.isStripPrefix(), zuulProperties.getRetryable(), null,
                    instanceInfos.getStatus().toString());

5.x

ZuulRouteDTO route = new ZuulRouteDTO(instanceId, "/" +
                    application.getName().toLowerCase() + "/" + instanceId + "/**",
                    null, url, zuulProperties.isStripPrefix(), zuulProperties.getRetryable(), Collections.emptySet(),
                    instanceInfos.getStatus().toString());

差別就在於倒數第二個參數sensitiveHeaders。也不知道新版中這裏構建一個空的Set到底有什麼用,但是很明顯,這樣構建在json中的結構是不一樣的,一個被當作對象來解析,一個會被當作數組來解析,如果解析方式沒有變化,就會出現json轉換失敗。詳細緣由沒有深究,把此處改過來。重新部署測試,一切正常!

不過查看,ZuulRouteDTO的相關構造方法,發現新版中sensitiveHeaders這個參數被標記了@NotNull,雖然測試沒有發現問題,但是不知道在後續的使用過程會不會有問題,需要關注這個問題。

發佈了106 篇原創文章 · 獲贊 46 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章