14

我有一个这样的 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;

` 我没有使用 spring cloud netflix。但我不断收到以下异常。

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);
4

4 回答 4

22

哇,这是一个棘手的问题。参数的顺序在这里很重要。

@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;

这行得通!!!

感谢我的高级开发人员。他找到了。

于 2017-04-24T19:03:16.237 回答
7

如 spencergibb 在本期中所述,feign 中的参数顺序无关紧要:https ://github.com/spring-cloud/spring-cloud-netflix/issues/1915 。如果您不将表单参数与正文参数一起使用,您应该搜索为什么您的参数之一被解释为表单参数。

我使用spring @RequestMapping 注释的具体问题是,由于拼写错误,feign 误解了我的一个参数注释,在我的情况下,我提供了请求路径值 /path/{pathParam} 并使用 @PathVariable("pathparam" ) 小写错字。

于 2019-02-22T10:37:00.790 回答
1

我有同样的错误,但不是因为参数的顺序。经调查发现问题出在我大摇大摆的定义中。我已经定义了路径中缺少的参数定义。IE:

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

变成:

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

解决了这个问题。希望它可以帮助有同样问题的人。

于 2018-07-23T13:16:30.110 回答
1

如果还有人像我一样来这里,还有另一种可能的情况。在使用查询参数和请求正文定义路径参数时,我遇到了同样的异常,如下所示:

    @RequestLine("POST /namespaces/{namespace}/releases/{release}")
    Response createRelease(ReleaseBody releaseBody,
                           @Param("namespace") String namespace,
                           @Param("release") String release,
                           @Param("plan") String planName);

IllegalStateException: Body parameters cannot be used with form parameters.即使在更新到 latest 后,我​​也收到了异常feign

在请求行中明确定义查询参数有助于:

    @RequestLine("POST /namespaces/{namespace}/releases/{release}?plan={plan}")
    Response createRelease(ReleaseBody releaseBody,
                           @Param("namespace") String namespace,
                           @Param("release") String release,
                           @Param("plan") String planName);
于 2021-08-18T12:28:34.117 回答