寫在前面
本文記錄下本人遇到的那些奇葩的接口的入參方式,以及使用Feign的傳參姿勢。
正文
正常操作
-
服務端:
- @GetMapping+@RequestParam
- @PostMapping+@RequestBody
-
客戶端:和服務端保持一致即可
奇葩操作
- 服務器
-
@GetMapping+@RequestBody, 這個是比較常見的了,解決方法是:
方法一:如果參數字段不多,就拆開對象的字段用@RequestParam註釋傳。
方法二:如果不想用一,那麼客戶端就用Map類型傳參,用@RequestParam,對象轉map方法在文末。
方法三:更換請求方式,詳見https://blog.csdn.net/FAw67J7/article/details/79885566 -
@PostMapping+@RequestParam ,很好理解,在所有參數前加上@RequestParam註解。method加上Post。
-
@PostMapping + 多參數,只能有一個參數是@RequestBody註釋,其他使用@RequestParam
-
常見報錯
-
java.lang.IllegalStateException: Method has too many Body parameters
一個feign的請求方法只能有一個參數是@RequestBody註釋,其他使用@RequestParam -
Request method ‘POST’ not supported
請求不支持’POST’方法,原因可能是傳參的時候使用了@RequestBody,這個時候方法有@GetMapping註解,依然被認爲是post請求,解決方法同奇葩操作一。 -
feign.FeignException$InternalServerError: status 500 reading
這個可能是接收服務傳回來的參數時序列化錯誤導致,檢查接收參數的對象字段是否和返回的參數字段格式相同。
結束
工具類代碼
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.math.BigDecimal;
import java.util.*;
/**
* Created by zrc on 2020-01-06.
*/
public class SwitchUtils {
public static String bigDecimal2String(BigDecimal num){
if(num==null){
return null;
}
return num.stripTrailingZeros().toPlainString();
}
//對象轉成map傳參
public static Map objectToMap(Object o) {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
String os = null;
Map map = null;
try {
os = mapper.writeValueAsString(o);
map = mapper.readValue(os,Map.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return map;
}
/**
* 把數組所有元素排序,並按照“參數=參數值”的模式用“&”字符拼接成字符串
*
* @param params 需要排序並參與字符拼接的參數組
* @return 拼接後字符串
*/
private static String createLinkString(Map<String, String> params) {
return createLinkString(params, true);
}
/**
* 把數組所有元素排序,並按照“參數=參數值”的模式用“&”字符拼接成字符串
*
* @param params 需要排序並參與字符拼接的參數組
* @return 拼接後字符串
*/
private static String createLinkString(Map<String, String> params, boolean sort) {
List<String> keys = new ArrayList<String>(params.keySet());
if (sort) {
Collections.sort(keys);
}
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i == keys.size() - 1) {//拼接時,不包括最後一個&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
}