問題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 注解