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