Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot implement simple file upload in Jersey - "annotated with POST of resource, class is not recognized as valid resource method. unavailable"

Tags:

java

rest

jersey

Unable to implement simple file upload using Jersey. Missing dependency errors raised at application bootstrap:

The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.foo.MyResource.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at parameter at index 0
  SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.foo.MyResource.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at parameter at index 1
  SEVERE: Method, public javax.ws.rs.core.Response com.foo.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), annotated with POST of resource, class com.foo.FS2Resource, is not recognized as valid resource method.
unavailable
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)

It seems like there is an issue with mapping the input parameters to a REST service? I have read documentation and followed several examples, and I am not deviating from those examples.

Here's the code:

@Path("v1/")
public class FileUploadResource {


    @POST
    @Path("upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces({MediaType.APPLICATION_JSON})
    public Response uploadFile(
        @FormDataParam("file") InputStream is,
        @FormDataParam("file") FormDataContentDisposition detail) {

        String name = detail.getFileName();

        // do upload stuff
        String output = .... 

        return Response.status(200).entity(output).build();
    }

}

I pulled in "compile 'com.sun.jersey.contribs:jersey-multipart:1.17.1'" for the FormDataParams.

EDIT: I was able to get it working in Jersey but only in this more primitive fashion:

 @POST
 @Path("upload")
 @Consumes(MediaType.MULTIPART_FORM_DATA)     
 @Produces(MediaType.TEXT_PLAIN)

 public Response uploadFile(final MimeMultipart file) {
   if (file == null) {
     return Response.status(Response.Status.BAD_REQUEST).entity("Must supply a valid file").build();

   try {
     for (int i = 0; i < file.getCount(); i++) {
       // ... do something with file.getBodyPart(i));
     }
     return Response.ok("done").build();
   } catch (final Exception e) {
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e).build();
   }
 }

This is probably a sufficient workaround, but would still like to get to the bottom of the issue.

like image 578
Robert Christian Avatar asked Aug 25 '13 16:08

Robert Christian


2 Answers

I had the same problem.

It was a version problem (I'd 1.8 in jersey.multipart and 1.17.1 in the rest of jersey). Setting all of them to 1.17.1 workrd for mee.

Took my answer from here:

Missing dependency for method when doing a file upload rest web service

like image 109
inigoD Avatar answered Nov 06 '22 00:11

inigoD


One visible problem in your code is that, you are using the same name for both the input multipart param i.e. "file"

@FormDataParam("file")

Multipart params do have an identifier, so you need to use the correct name for the second object in your method signature. Otherwise same param is going in inputstream and also for FormDataContentDisposition.

like image 31
Juned Ahsan Avatar answered Nov 06 '22 01:11

Juned Ahsan