Feign Client的使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign Client的使用相关的知识,希望对你有一定的参考价值。
参考技术A 我们在请求一个接口时,通知会采用如下做法这样看起来非常复杂,是否有一个更简单的方式,来解决请求问题,请看下面示例:
因为Spring是Java项目中最常用的基础框架之一,所以Spring生态系统还提供了另一种写法。不需要依赖自定义的Feign注解,但可以使用相同的Spring注解,就像定义控制器一样,例如@RequestMapping, @PathVariable等等。
Spring Boot Feign Client Method 参数过多
【中文标题】Spring Boot Feign Client Method 参数过多【英文标题】:SpringBoot FeignClient Method has too many paramters 【发布时间】:2017-09-22 02:49:11 【问题描述】:我使用 spring-cloud 的 feignClient,当我的界面中有多个 Beans 参数时出现问题,错误显示如下:
Caused by: java.lang.IllegalStateException: Method has too many Body parameters: public abstract com.wxl.pros.test.web.common.CommonResObject com.wxl.pros.test.web.feign.OrderFeignClient.createOrder(com.wxl.pros.test.services.form.order.CreateOrderForm,com.wxl.pros.test.services.vo.User)
at feign.Util.checkState(Util.java:128)
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:114)
at org.springframework.cloud.netflix.feign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:133)
at feign.Contract$BaseContract.parseAndValidatateMetadata(Contract.java:64)
at feign.hystrix.HystrixDelegatingContract.parseAndValidatateMetadata(HystrixDelegatingContract.java:34)
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:146)
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:53)
at feign.Feign$Builder.target(Feign.java:209)
at org.springframework.cloud.netflix.feign.HystrixTargeter.target(HystrixTargeter.java:48)
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:184)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
... 27 common frames omitted
这是我的接口方法之一:
@RequestMapping(value="/order/createOrder",method=RequestMethod.POST)
public CommonResObject createOrder(@RequestBody OrderForm orderForm,@RequestBody User user);
【问题讨论】:
一个请求只有一个主体。应该如何映射到 2 个不同的参数... 我的错,我也找到了,谢谢,现在我满足了调用这个方法时需要两个对象的需求,我怎样才能通过接收两个或多个对象参数来实现呢? 将它们包裹在另一个对象中... 【参考方案1】:@RequestBody 只能存在一个。如果有多个对象需要转移,可以使用json合并多个对象。
【讨论】:
【参考方案2】:您可以将它们放在第三个 pojo 中:
public class Order
OrderForm orderForm;
User user;
public Order(@JsonProperty("orderForm") orderForm, @JsonProperty("user") User user)
this.orderForm = orderForm;
this.user = user;
然后你的 API 就变成这样了:
@RequestMapping(value="/order/createOrder",method=RequestMethod.POST)
public CommonResObject createOrder(@RequestBody Order order);
【讨论】:
【参考方案3】:如果您有多个参数,一个请求正文和多个参数。使用精确的注释指定参数类型:
ResponseMessage<String> getCustomInformation((@RequestBody CustomRequest request, @RequestParam("language") String language,
@RequestParam("channel") String channel, @RequestParam("requestId") String requestId
【讨论】:
以上是关于Feign Client的使用的主要内容,如果未能解决你的问题,请参考以下文章
Feign Client + Eureka POST 请求体
如何使用 Spring Security 为 client_credentials 工作流向 Feign 客户端提供 OAuth2 令牌
Feign REST Client:如何获取 HTTP 状态?
Spring Boot 和 Feign Client 解析 Enum参数