web-dev-qa-db-ja.com

Spring BootFeignクライアントメソッドのパラメーターが多すぎます

私は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

これが私のインターフェースメソッドの1つです:

@RequestMapping(value="/order/createOrder",method=RequestMethod.POST)
    public CommonResObject createOrder(@RequestBody OrderForm orderForm,@RequestBody User user);
6
W.Lin

1つのリクエスト本文と複数のパラメータを持つ複数の引数がある場合。正確な注釈を使用して引数タイプを指定します。

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

@RequestBodyは1つしか存在できません。転送する必要のあるオブジェクトが複数ある場合は、jsonを使用して複数のオブジェクトをマージできます。

0
GuoGuang0536

それらを3番目の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);
0
Ean V