org.glassfish.jersey carregar arquivo com FormDataContentDisposition

http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/ Estou seguindo este guia e corro para um problema. Eu tenho algumas questões.

  1. Toda a dependência tem que ser correspondida? Meu projeto tem alguma dependência de org.glassfish.jersey e este guia sugere usar org.sun.jersey. Eu tenho que mudar isso também com a mesma versão como essa?

     org.glassfish.jersey.media jersey-media-multipart 2.16   org.glassfish.jersey.core jersey-server 2.16 
  2. Eu tenho esse erro

     org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] No injection source found for a parameter of type public ***.***.****.common.dto.response.AbstractResponse ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@90516e]}, definitionMethod=public ***.***.***.common.dto.response.AbstractResponse ***.***.*****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file1, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file1, defaultValue=null]], responseType=class ***.***.***.common.dto.response.AbstractResponse}, nameBindings=[]}'] 

    Este é meu serviço da web

     @POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public AbstractResponse upload(@FormDataParam("file1") InputStream file1, @FormDataParam("file1") FormDataContentDisposition filename1 ) { 

    Esta é minha binding:

     $.ajax({ url: 'http://localhost:8080/******/webapi/m2m/upload', data: fd, processData: false, contentType: 'multipart/form-data', type: 'POST', success: function(data){ alert(JSON.stringify(data)); return; } }); 

O serviço da web é acessível se tiver apenas 1 parâmetro (FormData InputStream). Como corrigi-lo?

  1. Eu também quero adicionar outro parâmetro String para o serviço da web. O que devo fazer?

Obrigado peeskillet pelas respostas. Um pouco extra.

 SEVERE: The web application [/linterm2m] created a ThreadLocal with key of type [org.jvnet.hk2.internal.PerLocatorUtilities$1] (value [org.jvnet.hk2.internal.PerLocatorUtilities$1@df94b1]) and a value of type [java.util.WeakHashMap] (value [{}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak. 

Se você está usando org.glassfish , está usando Jersey 2. com.sun é Jersey 1, e você nunca deve mixar os dois. Dito isto, o erro que você está enfrentando é provavelmente devido ao fato de que você não registrou o MultipartFeature . Quando o modelo de recurso (os methods de recurso) está sendo validado para “correção” na boot, se o recurso não estiver registrado, as annotations específicas para esse recurso são desconhecidas e é como não ter anotação. E você não pode ter mais de um parâmetro de método sem anotação.

Se você estiver usando um ResourceConfig , você pode simplesmente usar

 public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(MultiPartFeature.class); } } 

Se você estiver usando web.xml, poderá definir um para o servlet de Jersey que você registrou

  jersey.config.server.provider.classnames org.glassfish.jersey.media.multipart.MultiPartFeature  

“Eu também quero adicionar outro parâmetro String para o serviço da Web. O que devo fazer?”

Você precisará fazer isso como parte da solicitação multipartes e o cliente precisará enviá-lo como parte do multipart também. No lado do servidor apenas adicione outro @FormDataParam("anotherString") String anotherString como um parâmetro de método. Quanto ao cliente, eu não sei jQuery que vai ajudar com isso. Não testei, mas você pode tentar isso , que mostra os dados sendo anexados ao FormParam . Aqui está algo com Angular , onde eu mesmo construí o corpo da solicitação. Pode ser um pouco demais, pois você pode não precisar definir explicitamente os tipos de conteúdo.