SpringCloud FeignClient呼叫返回結果為null。

weixin_43950168發表於2020-12-11

SpringCloud FeignClient呼叫返回結果為null。

(1)遠端服務如下:
@ApiOperation("[+]獲取系統所有的專案")
@RequestMapping(value="/all", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public AppResponse<List> all() {

	// 1、分步查詢,先查出所有專案
	// 2、再查詢這些專案圖片
	List<ProjectVo> prosVo = new ArrayList<>();

	// 1、連線查詢,所有的專案left join 圖片表,查出所有的圖片
	// left join:笛卡爾積 A*B 1000萬*6 = 6000萬
	// 大表禁止連線查詢;
	List<TProject> pros = projectInfoService.getAllProjects();

	for (TProject tProject : pros) {
		Integer id = tProject.getId();
		List<TProjectImages> images = projectInfoService.getProjectImages(id);
		ProjectVo projectVo = new ProjectVo();
		BeanUtils.copyProperties(tProject, projectVo);

		。。。。。。。。。

	return AppResponse.ok(prosVo);
}

(2)FeignClient定義如下:
@FeignClient(value=“SCW-PROJECT”,fallback=ProjectInfoServiseFeignExceptionHandler.class)
public interface ProjectInfoServiseFeign {

@RequestMapping(value="project/all", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public AppResponse<List<ProjectVo>> all();

}

(3)使用FeignClient呼叫遠端服務程式碼省略。。。
每次返回結果都是null。因為無參,所以不是@RequestParam的問題;
經百度,發現可能是Feign在組裝Http請求去呼叫遠端服務時 請求頭引數有問題。所以加上【produces = MediaType.APPLICATION_JSON_UTF8_VALUE】。完美解決

總結:consumes定義了方法接受的Http的請求型別,produces則定義了Http請求返回的型別。

FeignClient,它的底層實現,就是根據定義的FeignClient,來組裝Http請求進行遠端呼叫,而Http預設的Content-type是x-www-form-urlencoded型別化。

因此,我們可以在FeignClient的定義上,指定produces = MediaType.APPLICATION_JSON_UTF8_VALUE,這樣,FeignClient在組裝Http請求的時候,就會在header裡面設定響應的資料型別為application/json;charset=UTF-8這樣,問題就完美解決。

相關文章