gpt4 book ai didi

java - 为什么 JAX-RS POST 不适用于多值映射

转载 作者:太空宇宙 更新时间:2023-11-04 10:06:09 25 4
gpt4 key购买 nike

我有 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"

我收到以下警告

A servlet request to the URI http://localhost:XXX/some/test contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

我发现的唯一原因涉及连接问题,显然我没有。

根据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();
}

多值 map 不显示的原因可能是什么?会不会是某种过滤?对于未知数量的参数,什么是替代方案?

更新这是由于 Jersey + Spring 的特殊性。解决办法见this回答。

最佳答案

What can be the reason the multivalued map doesn't? Could it be some filtering? What is an alternative for unknown number of parameters?

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

关于java - 为什么 JAX-RS POST 不适用于多值映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52895018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com