spring cloud config處理數(shù)組配置異常解決方法

項目接入了配置中心,之前選用的都是Spring Cloud相關(guān)組件底瓣,所以直接使用的就是Spring Cloud Config在接入的時候裕菠,一旦配置文件有數(shù)組相關(guān)配置,不管是properties文件還是yml文件都會報錯竖螃。

錯誤信息如下

Caused by: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON document: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '[' (code 91) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,1899] (through reference chain: org.springframework.cloud.config.environment.Environment["propertySources"]->java.util.ArrayList[3]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '[' (code 91) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,1899] (through reference chain: org.springframework.cloud.config.environment.Environment["propertySources"]->java.util.ArrayList[3])

跟蹤客戶端源碼發(fā)現(xiàn)初始化獲取配置信息是由ConfigServicePropertySourceLocator對象的locate()方法觸發(fā)


客戶端獲取遠(yuǎn)端配置信息方法

客戶端調(diào)用此方法會觸發(fā)到服務(wù)端的EnvironmentController中的labelled()方法淑廊,該方法會從相應(yīng)的配置倉庫返回配置信息,封裝成Environment對象返回


服務(wù)端加載配置信息并返回

看起來好像都沒什么問題斑鼻,可是實際執(zhí)行序列化和反序列化都是使用的Spring MVC的HttpMessageConverter來處理的蒋纬,如圖


客戶端發(fā)送請求的頭信息

這里可以明顯看到客戶端并沒有要求服務(wù)端必須返回json猎荠,那么服務(wù)端處理的時候選擇按照messageConverter的順序來判斷是否支持頭信息進(jìn)行序列化的


服務(wù)端選擇的轉(zhuǎn)換器對象

可以看到服務(wù)端選擇MappingJackson2XmlHttpMessageConverter這個轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換坚弱,所帶頭信息為application/xml蜀备,這就悲劇了,實際上有數(shù)組的情況下這個轉(zhuǎn)換器支持不了的荒叶。我們是希望用MappingJackson2HttpMessageConverter這個轉(zhuǎn)換器來轉(zhuǎn)換碾阁,它所支持的頭信息為application/json,這才是正確的些楣。脂凶。

由于客戶端寬泛的限制導(dǎo)致服務(wù)端并沒有處理好這個問題,我這里直接使用切面強(qiáng)制返回json數(shù)據(jù)并限制了頭信息為application/json保證客戶端解析的正確性愁茁。下面列出代碼

/**
 * @author xiezhengchao
 * @since 17/12/27 上午10:20.
 * 解決1.4.0.RELEASE版本返回值為數(shù)組時所引發(fā)的bug,如果后續(xù)版本修復(fù)了可以不需要這個切面配置
 */
@Aspect
@Component
public class EnvironmentAspect{

    private final Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();

    @Pointcut("execution(* org.springframework.cloud.config.server.environment.EnvironmentController.labelled(..))")
    public void getResource(){}

    @Around("getResource()")
    public Object labelledJson(ProceedingJoinPoint pjp) throws Throwable{
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();

        Object object = pjp.proceed();//執(zhí)行該方法

        finalOutput(response, object);
        return null;
    }

    private void finalOutput(HttpServletResponse response, Object result) throws IOException{
        response.setCharacterEncoding("UTF-8");
        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);

        String jsonStr = gson.toJson(result);

        writeData(response, jsonStr);
    }

    private void writeData(HttpServletResponse response, String jsonStr) throws IOException{
        try {
            response.getOutputStream().write(jsonStr.getBytes("UTF-8"));
        } finally {
            response.getOutputStream().flush();
            response.getOutputStream().close();
        }
    }

}

通過這種方法確保了客戶端返回的值都是通過json處理的蚕钦,解決了上面的問題。

其他

這個問題是完全沒想到會找了兩天才解決鹅很,去官網(wǎng)翻了一圈都沒發(fā)現(xiàn)配置數(shù)組問題的,google也沒搜到促煮。邮屁。只能看源碼翻了。
實際上如果你只是引用了spring cloud config那么不會出現(xiàn)這個問題菠齿,這是其他包的引用導(dǎo)致的佑吝,但是我還是覺得客戶端在發(fā)送的時候應(yīng)該直接限制好json這樣就沒有這么多問題了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绳匀,一起剝皮案震驚了整個濱河市芋忿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌襟士,老刑警劉巖盗飒,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陋桂,居然都是意外死亡逆趣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門嗜历,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宣渗,“玉大人,你說我怎么就攤上這事梨州『鄞眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵暴匠,是天一觀的道長鞍恢。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么帮掉? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任弦悉,我火速辦了婚禮,結(jié)果婚禮上蟆炊,老公的妹妹穿的比我還像新娘稽莉。我一直安慰自己,他們只是感情好涩搓,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布污秆。 她就那樣靜靜地躺著,像睡著了一般昧甘。 火紅的嫁衣襯著肌膚如雪良拼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天充边,我揣著相機(jī)與錄音将饺,去河邊找鬼。 笑死痛黎,一個胖子當(dāng)著我的面吹牛予弧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湖饱,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掖蛤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了井厌?” 一聲冷哼從身側(cè)響起蚓庭,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仅仆,沒想到半個月后器赞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓拜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年港柜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咳榜。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夏醉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涌韩,到底是詐尸還是另有隱情畔柔,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布臣樱,位于F島的核電站靶擦,受9級特大地震影響腮考,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玄捕,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一秸仙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桩盲,春花似錦、人聲如沸席吴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孝冒。三九已至柬姚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庄涡,已是汗流浹背量承。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留穴店,地道東北人撕捍。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像泣洞,于是被迫代替她去往敵國和親忧风。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容