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.
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
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?
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.