Java異常之----Caused by: java.lang.IllegalArgumentException: method GET must not have a request body

本文目錄

一、背景描述

二、出錯的代碼

三、出錯原因

四、解決方案

4.1 方案1:POST請求 + 註解

4.2 方案2:GET請求 + @SpringQueryMap註解


一、背景描述

公司做的智能家居系統改爲微服務框架,各個微服務之前相互調用。

今天在做測試的時候後臺系統報了一個Caused by: java.lang.IllegalArgumentException: method GET must not have a request body錯誤,然後檢查了請求鏈路從前到後一路上全部是GET請求方式。通過Debug調試,頁面請求可以打進serviceA,參數也可以攜帶進方法內,一步一步向下走,發現通過FeignClient調用serviceB的時候,報出這個異常。

二、出錯的代碼

ServiceB的接口代碼(通過FeignClient調用的接口)

/**
 * 根據主機sn查詢遠程運維記錄
 * @param distanceMaintainRecordQuery
 * @return
*/
@GetMapping("/client/v1.0/distanceMaintain/pageMaintain")
PageResult<DistanceMaintainRecordBO> pageMaintain(DistanceMaintainRecordQuery distanceMaintainRecordQuery);

三、出錯原因

報出這個異常的原因是:這個接口的請求方式是GET請求,接受的參數是一個對象(包含多個參數),而通過FeignClient調用的話Get方式是無法解析對象的,所以使用上述代碼會報Caused by: java.lang.IllegalArgumentException: method GET must not have a request body錯。

其實FeignClient是支持對象傳遞的,但是得是Map形式,而且不能爲空,與spring在機制上不兼容,因此無法使用。

而spring cloud在2.1.x版本中提供了@SpringQueryMap註解,可以傳遞對象參數,框架自動解析,只可惜啊,得是2.1.0以後的版本。

四、解決方案

4.1 方案1:POST請求 + 註解

將ServiceB接口的請求方式改爲POST,同時接受的參數前面加上@RequestBody註解,改正後的代碼如下:

/**
 * 根據主機sn查詢遠程運維記錄
 * @param distanceMaintainRecordQuery
 * @return
*/
@PostMapping("/client/v1.0/distanceMaintain/pageMaintain")
PageResult<DistanceMaintainRecordBO> pageMaintain(@RequestBody DistanceMaintainRecordQuery distanceMaintainRecordQuery);

4.2 方案2:GET請求 + @SpringQueryMap註解

/**
 * 根據主機sn查詢遠程運維記錄
 * @param distanceMaintainRecordQuery
 * @return
 */
@GetMapping("/client/v1.0/distanceMaintain/pageMaintain")
PageResult<DistanceMaintainRecordBO> pageMaintain(@SpringQueryMap DistanceMaintainRecordQuery distanceMaintainRecordQuery);

使用方案2的時候一定要注意Spring Cloud的版本,2.1.x以下的不支持哦,只有2.1.x以上版本才能解析參數。

 

注意:spring cloud項目使用FeignClient的時候get方式無法解析對象參數

 

拓展:如何使用Feign構造多參數的請求:http://www.itmuch.com/spring-cloud-sum/feign-multiple-params-2/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章