Метод SpringBoot FeignClient имеет слишком много параметров

я использую feignClient от spring-cloud, и что-то идет не так, когда в моем интерфейсе есть более одного параметра 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);

person W.Lin    schedule 25.04.2017    source источник
comment
запрос имеет только одно тело. Как это должно сопоставляться с двумя разными параметрами...   -  person M. Deinum    schedule 25.04.2017
comment
мой плохой, я тоже это нахожу, спасибо за это, и теперь я удовлетворяю потребности, когда при вызове этого метода требуются два объекта, как я могу добиться этого, получив два или более параметров объекта?   -  person W.Lin    schedule 25.04.2017
comment
Оберните их другим объектом...   -  person M. Deinum    schedule 25.04.2017


Ответы (3)


Если у вас есть несколько аргументов с одним телом запроса и большим количеством параметров. Укажите типы аргументов, используя точные аннотации:

ResponseMessage<String> getCustomInformation((@RequestBody CustomRequest request, @RequestParam("language") String language,
            @RequestParam("channel") String channel, @RequestParam("requestId") String requestId
person nanospeck    schedule 30.05.2018

Вы можете собрать их вместе в третьем 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);
person Ean V    schedule 06.01.2019

@RequestBody может существовать только один. Если у вас есть несколько объектов, которые необходимо передать, вы можете использовать json для объединения нескольких объектов.

person GuoGuang0536    schedule 11.06.2019