java - 将多个具有相同名称的 FormDataParams 发布到 java Jersey REST 服务

标签 java web-services rest jersey

我有一个 jersey 服务和单元测试(使用 jersey 客户端),可以与 3 个 FormDataParams 一起工作:

@Path("myService")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@POST
@Produces(MediaType.TEXT_PLAIN)
public Response doService(@FormDataParam("p1") String v1,
                         @FormDataParam("p2") InputStream v2,
                         @FormDataParam("p3") InputStream v3) throws IOException {

测试代码是这样的:

FormDataMultiPart fdmp = new FormDataMultiPart();      
fdmp.field("p1", v1);
fdmp.field("p2", v2);
fdmp.field("p3", v3);
ClientResponse response = service.path("myService").type(MediaType.MULTIPART_FORM_DATA).accept(MediaType.TEXT_PLAIN).post(ClientResponse.class, fdmp);

问题是当我更改它以支持 p1 字段的多个值时。我将服务签名部分从

@FormDataParam("p1") String v1,

@FormDataParam("p1") List<String> v1,

但后来我明白了

04-Apr-2012 18:56:59 com.sun.grizzly.http.servlet.ServletAdapter doService
SEVERE: service exception:
java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:172)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:265)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:996)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:947)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:938)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:399)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:478)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:663)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)

问题是如何更改上面发布的工作代码以允许“p1”参数有多个值。

最佳答案

您需要将参数更改为

@FormDataParam("p1") List<FormDataBodyPart> v1

然后在处理代码时拉掉字符串

for (FormDataBodyPart vPart : v1) {
    String v = vPart.getValueAs(String.class);
    ...

您也可以只调用 vPart.toString();这是一般的方法。

关于java - 将多个具有相同名称的 FormDataParams 发布到 java Jersey REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016921/

相关文章:

java - 显示带有使用反射关联的对象名称和方法的工具提示?

java - 将 Web 服务 URL 从 http 更改为 https 后,DocumentBuilder.parse() 抛出 java.net.UnknownHostException

web-services - REST 何时/如何取代 SOAP

java - CXF服务客户端中的"IOException: Strange I/O stream"

java - Eclipse 格式化程序 : Wrap Nested ArrayList Declarations

java - 使用 ZipOutputStream 压缩时 zip 无效

java - Android - onActivityResult 忽略存储的字节

java - @Transactional 在 REST 层还是在服务层?哪个更好?

node.js - 如何将 postman 的数据发布到 Output.json 文件?

php - Laravel REST API - 无限循环