Feign發送get請求使用對象傳參問題,@SpringQueryMap解析傳參對象父類屬性解決方案

使用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請求中使用有繼承關係的對象當做參數接收也是沒有問題的了。 

發佈了90 篇原創文章 · 獲贊 19 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章