使用Feign來調用Get請求時,如果方法的參數是一個對象,則會被強行轉變成Post請求,然後拋出服務被拒絕的錯誤。
具體原因就不說了,其他博客解釋的很清楚。也給出方案,使用apache httpclient替換jdk UrlConnection的解決方案嘗試過後並沒有成功。
隨後就發現了這個註解
@SpringQueryMap
這是spring cloud新增的一個註解, @SpringQueryMap 可以用來修飾pojo類,達到使用對象傳遞參數的需求。使用方法如下:
/** * @Description * @param requestVideoAuth * @date 2019/4/10 11:33 * @version V1.0.0 */ @GetMapping(value = "/feign/upload",produces = "application/json; charset=utf-8") Result uploadVideoAuth(@SpringQueryMap RequestVideoAuth requestVideoAuth);
在feign接口參數聲明之前添加 @SpringQueryMap即可。
但緊接着會發現另外一個問題,當你的參數對象是有父類的時候,你會發現父類的屬性是沒有被映射過來的,只傳遞了對象本身的屬性值。
對於這個問題github上也給出瞭解決方案:添加feign配置類
@Configuration public class FeignConfiguration { /** * @Description * @date 2019/5/21 17:27 * @version V1.0.0 */ @Bean Logger.Level feignLoggerLevel() { //這裏記錄所有,根據實際情況選擇合適的日誌level return Logger.Level.FULL; } /** * @Description 替換解析queryMap的類,實現父類中變量的映射 * @date 2019/5/21 16:59 * @version V1.0.0 */ @Bean public Feign.Builder feignBuilder() { return Feign.builder() .queryMapEncoder(new BeanQueryMapEncoder()) .retryer(Retryer.NEVER_RETRY); } }
然後在FeignClient上去配置即可。
@FeignClient(value = "springcloudapi",configuration = FeignConfiguration.class) public interface FeignVodService {}
至此,使用Feign的方式在Get請求中使用有繼承關係的對象當做參數接收也是沒有問題的了。