Java PUT:PathVariable和RequestParam don';我们不能一起工作

Java PUT:PathVariable和RequestParam don';我们不能一起工作,java,rest,spring-boot,put,Java,Rest,Spring Boot,Put,我使用的是SpringBoot2.1.3版本。在我的RestController中,我试图用一个PathVariable和一个RequestParam(application/x-www-form-urlencoded)设置一个PUT方法。 但是,当我调用它时,响应是一个错误的请求,因为所需的RequestParam不存在 我尝试将PutMapping更改为RequestMapping,交换参数位置并使用语法@RequestParam(value=“param2”,required=false)

我使用的是SpringBoot2.1.3版本。在我的RestController中,我试图用一个PathVariable和一个RequestParam(application/x-www-form-urlencoded)设置一个PUT方法。 但是,当我调用它时,响应是一个错误的请求,因为所需的RequestParam不存在

我尝试将PutMapping更改为RequestMapping,交换参数位置并使用语法@RequestParam(value=“param2”,required=false),但没有任何变化

好奇地使用后期贴图作品。删除PathVariable同样有效

以下是RestController代码:

@PutMapping(value="/myurl/{param1}", consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String myMethod( @PathVariable("param1") Integer param1, @RequestParam("param2") String param2);
我这样调用该方法:

curl -X PUT \
  http://localhost:8080/myurl/42 \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'param2=myparam2value'
答复是:

{ “时间戳”:1553613278534, “状态”:400, “错误”:“错误请求”, “消息”:“所需字符串参数'param2'不存在”, “路径”:“/myurl/42” }

我希望PUT的工作原理和POST一样,但似乎不是这样

不幸的是,我不能将参数作为QueryParam发送,所以我应该维护相同的请求调用,因为我正在重构一个以这种方式工作的现有端点

谢谢


编辑 我发现这是由于使用HandlerInterceptorAdapter(通过WebMVCConfiguer)造成的。 由于某种原因,在附近

org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues
org.apache.coyote.Request.parameters没有内容,并且抛出了一个异常,因此它只适用于POST而不适用于PUT(GET的处理方式不同)

我很感激如果有人能建议,如果这可以作为一个错误报告,考虑到删除拦截器使其工作

关于与以下内容一起使用:

curl-G-X PUT\
http://localhost:8080/myurl/42 \
-H'Accept:application/json'\
-H'内容类型:应用程序/x-www-form-urlencoded'\
--数据urlencode“param2=myparam2值”
从:

-G
-get
使用此选项时,将使使用
-d
--data
--data binary
--data urlencode
指定的所有数据在HTTP
GET
请求中使用,而不是在其他情况下使用的
POST
请求。数据将被附加到带有
分隔符的URL。[……]

--数据URL编码
(HTTP)该选项发布数据,与其他
-d
--data
选项类似,但执行URL编码除外。[……]


{id}?选择器={foo}--id->PathParam和foo->RequestParam。我猜你把“RequestParam”和“HTTP请求体”混为一谈了。如果您的'param2'是请求的主体,请删除@RequestParam注释。您可以尝试以下操作:curl-X PUT\\-H'Accept:application/json'\-H'内容类型:application/X-www-form-urlencoded'\参数进入请求主体,而不是参数。谢谢@Logan Wlv。不幸的是,我需要维护相同的调用约定,因为我正在重构一个现有端点。您能解释一下为什么他的示例使用@PostMapping吗?您只需要阅读-G选项的文档:使用此选项时,所有数据都将使用-d、-data、,--data binary或--data urlencode将在HTTP GET请求中使用,而不是在POST请求中使用。数据将附加到带有“?”分隔符的URL。感谢您的回复。不幸的是,我正在重构遗留端点,因此无法更改调用。在我看来,这似乎是一个春季启动错误,在我的拙见。