【发布时间】:2019-03-24 12:03:20
【问题描述】:
我有 JAX-RS 2.8.9 和 Spring 4.3.4 应用程序。我对以下服务器代码执行了一个非常简单的 POST 请求
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(MultivaluedMap<String, String> work) {
return Response.ok(work.keySet().size()).build();
}
我用 curl 测试:
curl -i -X POST 'http://localhost:XXX/some/test' -d "param=value¶m2=value2" -H "Content-Type: application/x-www-form-urlencoded"
我收到以下警告
对 URI http://localhost:XXX/some/test 的 servlet 请求在请求正文中包含表单参数,但请求正文已被 servlet 或访问请求参数的 servlet 过滤器使用。只有使用 @FormParam 的资源方法才能按预期工作。通过其他方式消耗请求正文的资源方法将无法按预期工作。
关于我发现的唯一原因涉及连接问题,显然我没有。
根据documentation,当我们传递了可变数量的 FormParams 时,这是处理这种情况的方法。
不过,这行得通。
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(@FormParam("param") String param) {
return Response.ok(param).build();
}
多值映射没有的原因是什么?会不会是一些过滤?未知数量的参数有什么替代方案?
更新 是由于 Jersey + Spring 的特殊性。 可以在this答案中找到解决方案。
【问题讨论】:
-
这些参数是否共享相同的数据类型?
-
是的,它们是字符串键值;我只是在描述中添加了我如何测试的示例。
-
您在问题中标记了 [spring]。您如何将 Spring 整合到您的应用程序中?有一个使用请求参数的 Spring servlet 过滤器。这可能是原因,而且经常是。
-
有一种解决方法,您可以将
@Context ContainerReqeust注入您的方法参数并使用request.getProperty(InternalServerProperties.FORM_DECODED_PROPERTY),它将返回Form -
谢谢,我试过了,但问题确实出在字符串请求过滤器中。我在描述中链接了一个答案。