【问题标题】:Why JAX-RS POST does not work with multivalued map为什么 JAX-RS POST 不适用于多值映射
【发布时间】: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&param2=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
  • 谢谢,我试过了,但问题确实出在字符串请求过滤器中。我在描述中链接了一个答案。

标签: java spring rest jax-rs


【解决方案1】:

多值映射没有的原因是什么?会不会是一些过滤?未知数量的参数有什么替代方案?

默认情况下,您的 JAX-RS 实现似乎正在检测表单输入并在正文到达您的方法之前对其进行读取/处理。你试过了吗:

@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(Form workForm) {
    MultivaluedMap<String,String> work = workForm.asMap();
    return Response.ok(work.keySet().size()).build();
}

?

Form 是一个特殊的 JAX-RS 类,它封装了所有表单参数,应该可以用作方法的输入参数。

【讨论】:

  • 不幸的是,这没有成功。原来 Spring + Jersey 有问题,解决方法在这里找到。
猜你喜欢
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2011-10-26
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多