web-dev-qa-db-ja.com

本体パラメーターはフォームパラメーターと一緒に使用できません-ヘッダーとjsonデータを持つ偽のクライアント

私はこのようなFeignClientを持っています

@RequestLine("POST /enroll")
@Headers({ "header1: {header1}", "header2: {header2}", "Content-Type: application/json" })
ResponseDto enroll(@Param("header1") String header1,@Param("header1") String header1, RequestDto requestDto)throws MyCustomException;

`私はSpringCloudNetflixを使用していません。しかし、私は以下の例外を受け取り続けています。

Caused by: Java.lang.IllegalStateException: Body parameters cannot be used with form parameters.
at feign.Util.checkState(Util.Java:128)
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.Java:112)
at feign.Contract$BaseContract.parseAndValidatateMetadata(Contract.Java:64)
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.Java:146)
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.Java:53)
at feign.Feign$Builder.target(Feign.Java:209)
at feign.Feign$Builder.target(Feign.Java:205)

私はこのようにクライアントをインスタンス化しています。

return Feign.builder()
        .encoder(new JacksonEncoder())
        .decoder(new JacksonDecoder())
        .logger(new Slf4jLogger())
        .logLevel(Logger.Level.FULL)
        .target(RegularFeignClient.class, url);
10

これはトリッキーなものです。ここでは、パラメーターの順序が重要です。

@RequestLine("POST /enroll")
@Headers({ "header1: {header1}", "header2: {header2}", "Content-Type: application/json" })
ResponseDto enroll(RequestDto requestDto, @Param("header1") String header1,@Param("header1") String header1)throws MyCustomException;

これは動作します!!!

私の上級開発者に感謝します。彼はそれを見つけました。

14

この号でspencergibbが述べているように、偽のパラメーターの順序は重要ではありません: https://github.com/spring-cloud/spring-cloud-netflix/issues/1915 。ボディパラメータと一緒にフォームパラメータを使用しない場合は、パラメータの1つがフォームパラメータとして解釈される理由を検索する必要があります。

Spring @RequestMappingアノテーションを使用した私の特定の問題は、タイプミスが原因でfeignがパラメータアノテーションの1つを誤って解釈していたことでした。私の場合、リクエストパス値/ path/{pathParam}を指定し、@ PathVariable( "pathparam" )小文字のタイプミスあり。

3
NicolasG

同じエラーが発生しますが、パラメータの順序が原因ではありません。調査の結果、問題は私のスワッガーの定義にあることがわかりました。パスに欠落しているパラメーター定義を定義しました。すなわち:

     /someapi/bla/{parm1}/bla/
       parameters:
          - $ref: '#/parameters/parm1'
          - $ref: '#/parameters/parm2'

変更:

     /someapi/bla/{parm1}/bla/
       parameters:
          - $ref: '#/parameters/parm1'

問題を解決しました。それが同じ問題を抱えている人に役立つことを願っています。

0
amit