【问题标题】:Springcloud Netflix Feign Parameters orderSpringcloud Netflix Feign 参数顺序
【发布时间】:2017-10-01 15:04:54
【问题描述】:

有什么原因可以解释为什么我在声明这样的 feign 接口方法时出现编译错误(Body parameters cannot be used with form parameters):

1) foo(@PathVariable("pathVariableName") String pathVariable, 
       @RequestBody List<String> anyVariable)

但是当我使用它时一切正常(切换参数顺序):

2) foo(@RequestBody List<String> anyVariable, 
       @PathVariable("pathVariableName") String pathVariable)

在当前项目中,所有其他 feign 方法在前一种形式下都可以正常工作。我不知道这些信息是否重要,但这是我唯一尝试使用带有@RequestBody 参数注释的列表的信息。

参数的顺序在这里像answer 这样重要吗?这种情况下,哪些情况下需要注意参数顺序呢? Feign documentation 似乎按照我遇到问题的方式使用它。

顺便说一句:在成功编译之后,在尝试运行应用程序之前,我停止了我的项目几分钟以在此处发布此内容。我不确定上面的第二种方法在运行时是否可以正常工作。它只是通过编译阶段没有错误。

编辑:这并不是真正的编译错误。 springboot应用程序启动过程中出现的错误。

【问题讨论】:

    标签: spring-cloud-netflix netflix-feign


    【解决方案1】:

    您需要检查您的 url 模板字符串。如果 url 中不包含{pathVariableName}@PathVariable("pathVariableName") 将被视为表单参数。在 feign 中,表单参数不能与 body 参数(@RequestBody)在同一方法中使用。这就是 1) 抛出异常的原因。

    第二种情况,验证@RequestBody注解时,feign不知道第二个参数的存在,会被当作表单参数。所以它现在不会抛出任何异常。我不确定这是否是故意行为,但可能是验证错误。

    【讨论】:

    • 路径变量在 url 中。它给我们留下了一个悬而未决的问题:如果这看起来像是一个验证错误,为什么它只是在这种特殊情况下发生。我在这个项目中有很多假装方法调用,其中 20%-30% 使用 PathVariable 和 RequestBody 发布帖子。他们都没有抱怨在编译时使用 PathVariable 作为第一个参数。我认为您所说的有道理,关于不将两个注释一起使用。但是,正如我所说,我还没有测试它们(我将在今天开始测试阶段)。我打算在完成 POST 测试后立即在此处发布结果。
    • 在错误情况下,您的 url 字符串是否有带有 {xxx} 的路径参数占位符?我从 feign 源中发现的是,如果 url 字符串中没有 PathVariable 占位符,则 feign 将 PathVariable 视为 Form 参数。而且Form参数和RequestBody不能一起使用。
    • 我的错误。为自己感到羞耻。我在 PathVariable 中输错了“appID”。我输入了“appId”(小写“d”)。非常抱歉因为这个愚蠢的错误耽误了您的时间。
    • 您的回答解决了我的问题。谢谢。
    猜你喜欢
    • 2019-07-27
    • 2017-04-14
    • 2016-12-09
    • 2020-06-29
    • 2015-02-08
    • 1970-01-01
    • 2018-02-01
    • 2018-09-24
    • 2017-08-19
    相关资源
    最近更新 更多