2017-05-03 59 views
0

是否有解释了为什么我得到一个编译错误(Body parameters cannot be used with form parameters)当宣布这样的假死接口方法的任何原因:Springcloud Netflix的假死参数订购

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似乎以我遇到问题的方式使用它。

顺便说一下:在成功完成编译之后,我试图在运行应用程序之前停止了我的项目几分钟,在此处发布此文档,。我不确定上面的第二种方法在运行时是否正常工作。它只是在编译阶段传递而没有错误。

编辑:这不是一个真正的编译错误。在启动应用程序的启动过程中发生错误。

回答

2

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

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

+0

路径变量在url中。它给我们留下了一个悬而未决的问题:如果这看起来像是一个验证错误,那么为什么会发生这种特殊情况。我在这个项目中有很多假装方法调用,并且有20%-30%的人使用PathVariable和RequestBody做了一个帖子。他们都没有抱怨在编译时使用PathVariable作为第一个参数。我认为你所说的话是有道理的,关于不一起使用这两个注释。但是,正如我所说,我还没有测试过它们(今天我将开始测试阶段)。我打算在完成POST测试后立即在此发布结果。 – jpavel

+1

在错误情况下,你的url字符串是否有'{xxx}'的路径参数占位符?我从feign源中发现的是,如果在url字符串中没有PathVariable占位符,feign会将PathVariable视为Form参数。 Form参数和RequestBody不能一起使用。我的错误是 –

+0

。为自己感到羞耻。我错误地输入了PathVariable中的“appID”。我输入了“appId”(小写“d”)。非常非常抱歉,因为这个愚蠢的错误而浪费时间。 – jpavel