Spring Cloud使用OpenFeign調(diào)用接口各種問題

問題1:調(diào)用get接口報(bào)錯“不支持POST請求方法,支持以下GET”

服務(wù)端Controller接口代碼
    @GetMapping("/personAuthQueryHikDeviceIdList")
    public List<String> personAuthQueryHikDeviceIdList(AsSysResidentDTO sysResident) {
        return hikEmployeeService.personAuthQueryHikDeviceIdList(sysResident);
    }
客戶端Service接口代碼
    @GetMapping("/personAuthQueryHikDeviceIdList")
    List<String> personAuthQueryHikDeviceIdList(AsSysResidentDTO sysResident);

接口均定義為get請求,但是報(bào)錯:不支持POST請求方法,支持以下GET。
出錯原因?yàn)閛penfeign調(diào)用get接口時不支持對象類型傳參,僅支持基礎(chǔ)類型傳參。

解決方法1:參數(shù)添加@SpringQueryMap注解

服務(wù)端Controller接口代碼

    @GetMapping("/personAuthQueryHikDeviceIdList")
    public List<String> personAuthQueryHikDeviceIdList(@SpringQueryMap AsSysResidentDTO sysResident) {
        return hikEmployeeService.personAuthQueryHikDeviceIdList(sysResident);
    }

客戶端Service接口代碼

    @GetMapping("/personAuthQueryHikDeviceIdList")
    List<String> personAuthQueryHikDeviceIdList(@SpringQueryMap AsSysResidentDTO sysResident);
解決方法2:使用post請求方式,參數(shù)添加@RequestBody注解

問題2:調(diào)用get接口傳對象參數(shù)時,對象中的Date類型接參錯誤

實(shí)測使用get請求加@SpringQueryMap注解傳輸對象參數(shù)時,對象含有Date類型屬性時,接參會有14個小時的時差,月份可能也會被+1。

解決方法:使用post請求方式,參數(shù)添加@RequestBody注解

對象中的Date屬性添加注解,例:

    /**創(chuàng)建日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;

實(shí)測如果Date屬性不加注解windows系統(tǒng)本地也能正常接參,但是因?yàn)闆]有設(shè)置時區(qū)不確定linux下是否會出問題,建議加注解!

問題3:調(diào)用post接口服務(wù)端報(bào)錯“Content type 'application/json;charset=UTF-8' not supported”

控制臺報(bào)錯信息

2023-01-09 11:21:58.330 [http-nio-7070-exec-1] ERROR o.jeecg.common.exception.JeecgBootExceptionHandler:82 - Content type 'application/json;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

問題原因:接口參數(shù)類型為Map<Person, List<Device>>,應(yīng)該是不支持使用對象作為Map的key進(jìn)行傳參。
解決方法:將參數(shù)結(jié)構(gòu)進(jìn)行調(diào)整,避免使用對象作為Map的key

問題4:接口報(bào)錯“feign.FeignException$Unauthorized: [401 Unauthorized] during [GET] to ......”

這個問題是我將代碼改為異步時產(chǎn)生的,去百度搜索大部分文章都是讓加請求攔截器(RequestInterceptor),但是我已經(jīng)加了,還是不好使。
問題原因:調(diào)用openfeign接口時,必須使用主線程調(diào)用,這樣在訪問其他服務(wù)時,拼裝的請求會復(fù)制當(dāng)前請求的token等信息,而我是異步調(diào)用的,拼裝的請求時通過“(ServletRequestAttributes) RequestContextHolder.getRequestAttributes()”沒有獲取到當(dāng)前請求的token等信息,導(dǎo)致登錄認(rèn)證失敗
解決方法:暫時調(diào)整為主線程執(zhí)行,后續(xù)會考慮使用其他方式實(shí)現(xiàn)異步效果,避免因openfeign調(diào)用導(dǎo)致請求處理報(bào)錯

問題5:調(diào)用get接口報(bào)錯“不支持POST請求方法,支持以下GET”

接口代碼

    @GetMapping("queryByDeviceId")
    AsDeviceManageDTO queryByDeviceId(String hikDeviceId);

問題原因:實(shí)測是因?yàn)閰?shù)沒有加注解導(dǎo)致的
解決方法:給參數(shù)添加 @RequestParam 注解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容