Posting multiple FormDataParams of the same name to a jersey REST javas service

I have a jersey service and unit test (using a jersey client) that worked fine with 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 { 

The test code is as follows:

 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); 

The problem is that I am changing it to support multiple values ​​for the p1 field. I changed the service signature part with

 @FormDataParam("p1") String v1, 

to

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

but then i get

 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) 

The question is how to change the working code that I posted above to allow multiple values ​​for the "p1" parameter.

+6
source share
1 answer

You want to change the setting to

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

and then pull the lines when processing the code

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

Perhaps you can just call vPart.toString() ; This is a common method.

+7
source

Source: https://habr.com/ru/post/912425/


All Articles