为什么JAX-RS POST不适用于多值地图

时间:2018-10-19 14:59:20

标签: java spring rest jax-rs

我有带有Spring 4.3.4应用程序的JAX-RS 2.8.9。我对以下服务器代码执行了一个非常简单的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 -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答案中找到解决方案。

1 个答案:

答案 0 :(得分:0)

  

多值地图不显示的原因可能是什么?可以过滤一下吗?对于未知数量的参数,有什么替代方法?

默认情况下,看来您的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类,它封装了所有表单参数,并且可以用作方法的输入参数。