Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Posting multiple FormDataParams with the same name to java Jersey REST service

I have a jersey service and unit test (using jersey client) that worked ok 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 like this:

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 when I change it to support multiple values for the p1 field. I changed the service signature part from

@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 do I change the working code I posted above to allow multiple values for the "p1" parameter.

like image 812
Alb Avatar asked Apr 04 '12 18:04

Alb


1 Answers

You'll want to change the parameter to

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

and then pull the Strings off as you process the code

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

You might be able to just call vPart.toString() as well; this is the general method.

like image 193
coyotesqrl Avatar answered Oct 06 '22 00:10

coyotesqrl