正文参数不能与表单参数一起使用 - 具有标头和 json 数据的 Feign 客户端

2022-09-02 23:54:07

我有一个像这样的假装客户

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

'我没有使用春天的云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);

答案 1

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

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

这有效!!!

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


答案 2

假装参数的顺序不应该像斯宾塞吉布在本期中所说的那样重要:https://github.com/spring-cloud/spring-cloud-netflix/issues/1915。如果不将表单参数与正文参数一起使用,则应搜索为什么其中一个参数被解释为表单参数。

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


推荐