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请求中使用有继承关系的对象当做参数接收也是没有问题的了。 

你可能感兴趣的:(spring,cloud)