dev@jersey.java.net

need help with parsing multipart/form-data input ( NullPointerException in 1.0.1-SNAPSHOT )

From: <moiz_at_dohadwala.net>
Date: Fri, 7 Nov 2008 11:19:35 -0500

Hello, I am working on migrating a (legacy!) PHP server to a RESTful one using jersey. However, the server needs to be backwards compatible with existing clients ( 1000s ) until they upgrade. The current client perform a POST operation, listed below. The problem I have is that with Jersey 1.0, I get null values for the @FormData annotated method parameters. With jersey 1.0.1-SNAPSHOT deployed yesterday, I get a NullPointerException. I have also listed my resource below along with the stacktrace from the 1.0.1-SNAPSHOT. Post sample: POST /Subscribe/list1 HTTP/1.1 User-Agent: Player|Windows|1.5.0.17874|https://staging.ivy-qa.com/ Host: staging.ivy-qa.com Accept: */* Content-Length: 395 Expect: 100-continue Content-Type: multipart/form-data; boundary=----------------------------7aaff3ab83ee HTTP/1.1 100 Continue ------------------------------7aaff3ab83ee Content-Disposition: form-data; name="engine_id" e23f219e-a1e4-4037-b257-f1c488b49a5d ------------------------------7aaff3ab83ee Content-Disposition: form-data; name="list" list1 ------------------------------7aaff3ab83ee Content-Disposition: form-data; name="protocol" 0.1 ------------------------------7aaff3ab83ee-- Resource source: package com.corp.m5es.rest.resources.list; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeMultipart; @Path("/SubscribeList/{listId}") @Consumes("multipart/form-data") @Produces("application/x-www-form-urlencoded") public class ListSubscription { @POST @Consumes("multipart/form-data") public String createSubscription( @PathParam("listId") String listId, @FormParam( "engine_id" ) String engineId, @FormParam( "list" ) String formListId, @FormParam( "protocol" ) int protocol ) { System.out.println(listId); System.out.println(engineId); System.out.println(formListId); System.out.println(protocol); return "test"; } } Only the @PathParam argument has the right value. All other @FormParam annotated arguments are nulls or 0s. Here's the exception, if I use 1.0.1-SNAPSHOT version of jersey-multipart: Starting grizzly... Nov 7, 2008 8:16:34 AM com.sun.grizzly.http.servlet.ServletAdapter service SEVERE: service exception: javax.servlet.ServletException: com.sun.jersey.api.container.ContainerException: Exception injecting parameters to Web resource method at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:351) at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at com.sun.grizzly.http.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:141) at com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:220) at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:148) at com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:621) at com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:552) at com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:800) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:152) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.SelectorThread$1.execute(SelectorThread.java:649) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:67) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:56) at com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:169) Caused by: com.sun.jersey.api.container.ContainerException: Exception injecting parameters to Web resource method at com.sun.jersey.impl.model.method.dispatch.FormDispatchProvider$FormParamInInvoker.getParams(FormDispatchProvider.java:99) at com.sun.jersey.impl.model.method.dispatch.FormDispatchProvider$TypeOutInvoker._dispatch(FormDispatchProvider.java:128) at com.sun.jersey.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67) at com.sun.jersey.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:124) at com.sun.jersey.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:71) at com.sun.jersey.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111) at com.sun.jersey.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:63) at com.sun.jersey.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:551) at com.sun.jersey.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:510) at com.sun.jersey.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:501) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:349) ... 15 more Caused by: com.sun.jersey.api.container.ContainerException: java.lang.NullPointerException at com.sun.jersey.impl.model.method.dispatch.MultipartFormDispatchProvider$MultipartFormParamInjectable.getValue(MultipartFormDispatchProvider.java:146) at com.sun.jersey.impl.model.method.dispatch.FormDispatchProvider$FormParamInInvoker.getParams(FormDispatchProvider.java:93) ... 25 more Caused by: java.lang.NullPointerException at com.sun.jersey.impl.model.method.dispatch.MultipartFormDispatchProvider$MultipartFormParamInjectable.getAsMultipartFormData(MultipartFormDispatchProvider.java:186) at com.sun.jersey.impl.model.method.dispatch.MultipartFormDispatchProvider$MultipartFormParamInjectable.getValue(MultipartFormDispatchProvider.java:143) ... 26 more Thanks, -Moiz