【问题标题】:SpringBoot FeignClient Method has too many paramtersSpring Boot Feign Client Method 参数过多
【发布时间】: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 个不同的参数...
  • 我的错,我也找到了,谢谢,现在我满足了调用这个方法时需要两个对象的需求,我怎样才能通过接收两个或多个对象参数来实现呢?
  • 将它们包裹在另一个对象中...

标签: spring spring-cloud spring-cloud-feign


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2019-02-11
        • 1970-01-01
        • 2017-10-07
        • 2023-04-02
        • 2020-02-16
        • 2015-11-12
        • 2018-01-29
        • 2018-02-01
        • 1970-01-01
        相关资源
        最近更新 更多