正文参数不能与表单参数一起使用 - Feign client with Headers and json data
Body parameters cannot be used with form parameters - Feign client with Headers and json data
我有一个这样的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 云 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);
哇,这真是个棘手的问题。参数的顺序在这里很重要。
@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;
这有效!!!
感谢我的高级开发人员。他找到了。
我有同样的错误,但不是因为参数的顺序。经查发现问题出在我的swagger定义上。我已经定义了路径中缺少的参数定义。即:
/someapi/bla/{parm1}/bla/
parameters:
- $ref: '#/parameters/parm1'
- $ref: '#/parameters/parm2'
更改为:
/someapi/bla/{parm1}/bla/
parameters:
- $ref: '#/parameters/parm1'
问题已解决。希望对遇到同样问题的人有所帮助。
如 spencergibb 在本期中所述,feign 中的参数顺序无关紧要:https://github.com/spring-cloud/spring-cloud-netflix/issues/1915。如果您没有将表单参数与正文参数一起使用,您应该搜索为什么您的一个参数被解释为表单参数。
我的具体问题是,使用 spring @RequestMapping 注释是因为打字错误,假装误解了我的一个参数注释,在我的例子中,我提供了一个请求路径值 /path/{pathParam} 并且输入错误spring 带有 @PathVariable("pathparam") 的注释,有小写拼写错误。
如果还有人像我一样来这里,还有另一种可能。
在使用查询参数和请求正文定义路径参数时,我遇到了同样的异常,如下所示:
@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.
即使更新到最新 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);
我有一个这样的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 云 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);
哇,这真是个棘手的问题。参数的顺序在这里很重要。
@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;
这有效!!!
感谢我的高级开发人员。他找到了。
我有同样的错误,但不是因为参数的顺序。经查发现问题出在我的swagger定义上。我已经定义了路径中缺少的参数定义。即:
/someapi/bla/{parm1}/bla/
parameters:
- $ref: '#/parameters/parm1'
- $ref: '#/parameters/parm2'
更改为:
/someapi/bla/{parm1}/bla/
parameters:
- $ref: '#/parameters/parm1'
问题已解决。希望对遇到同样问题的人有所帮助。
如 spencergibb 在本期中所述,feign 中的参数顺序无关紧要:https://github.com/spring-cloud/spring-cloud-netflix/issues/1915。如果您没有将表单参数与正文参数一起使用,您应该搜索为什么您的一个参数被解释为表单参数。
我的具体问题是,使用 spring @RequestMapping 注释是因为打字错误,假装误解了我的一个参数注释,在我的例子中,我提供了一个请求路径值 /path/{pathParam} 并且输入错误spring 带有 @PathVariable("pathparam") 的注释,有小写拼写错误。
如果还有人像我一样来这里,还有另一种可能。 在使用查询参数和请求正文定义路径参数时,我遇到了同样的异常,如下所示:
@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.
即使更新到最新 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);