java rest jersey multipartform-data jersey-2.0

MULTIPART_FORM_DATA: no se encontró fuente de inyección para un parámetro de tipo public javax.ws.rs.core.Response



rest jersey (7)

Deshágase de jersey-multipart-1.18.jar . Eso es para Jersey 1.x. Agrega estos dos

Para Maven, usaría la siguiente dependencia (no necesita agregar explícitamente la dependencia mimepull , ya que esta la activará).

<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.17</version> <!-- Make sure the Jersey version matches the one you are currently using --> </dependency>

Entonces necesita registrar la MultiPartFeature . Si está utilizando un ResourceConfig para la configuración, simplemente puede hacer

register(MultiPartFeature.class);

Si está utilizando web.xml, puede agregar la clase como <init-param> al servlet Jersey

<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value> </init-param>

Tenga en cuenta que si tiene varios proveedores que desea registrar, puede delimitar cada clase de proveedor con una coma o punto y coma. No puede usar este mismo param-name dos veces. Ver la respuesta de Suarabh

ACTUALIZAR

Además, una vez que se deshaga de jersey-multipart-1.18.jar , tendrá errores de compilación para las clases importadas que faltan. En su mayor parte, los nombres de clase siguen siendo los mismos, solo los paquetes han cambiado, es decir

Aparte

Si está aquí para una ModelValidationException diferente, aquí hay algunos enlaces para obtener información sobre otras causas de la excepción.

Estoy utilizando la estrategia de implementación del Servicio de descanso basado en Jersey para crear un servicio que se utilizará para cargar archivos. El nombre de mi clase de servicio es: UploadFileService.java (Ver Código a continuación)

package com.jerser.service; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; @Path("/fileUpload") public class UploadFileService { @POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadFile( @FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) { String uploadedFileLocation = "d://uploaded/" + fileDetail.getFileName(); // save it writeToFile(uploadedInputStream, uploadedFileLocation); String output = "File uploaded to : " + uploadedFileLocation; return Response.status(200).entity(output).build(); } // save uploaded file to new location private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) { try { OutputStream out = new FileOutputStream(new File( uploadedFileLocation)); int read = 0; byte[] bytes = new byte[1024]; out = new FileOutputStream(new File(uploadedFileLocation)); while ((read = uploadedInputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }

Estos son los archivos JAR que tengo dentro de mi lib:

aopalliance-repackaged-2.4.0-b10.jar asm-debug-all-5.0.2.jar hk2-api-2.4.0-b10.jar hk2-locator-2.4.0-b10.jar hk2-utils-2.4.0-b10.jar javassist-3.18.1-GA.jar javax.annotation-api-1.2.jar javax.inject-2.4.0-b10.jar javax.servlet-api-3.0.1.jar javax.ws.rs-api-2.0.1.jar jaxb-api-2.2.7.jar jersey-client.jar jersey-common.jar jersey-container-servlet-core.jar jersey-container-servlet.jar jersey-core-1.11.jar jersey-guava-2.17.jar jersey-media-jaxb.jar jersey-multipart-1.18.jar jersey-server.jar org.osgi.core-4.2.0.jar osgi-resource-locator-1.0.1.jar persistence-api-1.0.jar validation-api-1.1.0.Final.jar

Recibo el siguiente error cuando intento actualizar mi servidor Tomcat:

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 javax.ws.rs.core.Response com.jerser.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.; source=''ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.jerser.service.UploadFileService, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@d3e2d4]}, definitionMethod=public javax.ws.rs.core.Response com.jerser.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class com.sun.jersey.core.header.FormDataContentDisposition, source=file, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}''] at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:528) at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:166) at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:327) at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289) at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286) at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:324) at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:338) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:171) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:363) at javax.servlet.GenericServlet.init(GenericServlet.java:160) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1176) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1102) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1009) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4885) at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5212) at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5207) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

En Internet encontré que hay muchos ejemplos que muestran cómo cargar un archivo MULTIPART usando la API RESTFul. Pero con la misma solución. No puedo ejecutar ese código también. Creo que estoy haciendo algo mal con los archivos JAR. ¿Podría alguien ayudarme en esto?


Otra posible causa de este error muy genérico es que Jersey solo busca fábricas asociadas con la última anotación cuando se declaran varias en un parámetro. (Ver informe de error )

Hasta que esto se solucione, si está utilizando otras anotaciones además de @FormDataParam , tiene que ser el último.

Esto funciona:

package org.research.s3.service import io.dropwizard.Application import io.dropwizard.setup.Environment import org.research.s3.service.resource._ import org.research.service.s3.resource.UploadResource import org.glassfish.jersey.media.multipart.{FormDataParam,MultiPartFeature} class CmdaaApp() extends Application[CmdaaAppConfig] { override def run(t: CmdaaAppConfig, env: Environment): Unit = { env.jersey().register(new RootResource) //Need this to make the file upload code work in env.jersey().register(new MultiPartFeature) env.jersey().register(new UploadResource(curBucket)) } } object CmdaaApp { def main(args: Array[String]): Unit = new CmdaaApp().run(args: _*) }

Esto no lo hace:

package org.research.service.s3.resource import java.io.{FileInputStream, InputStream} import com.google.gson.{Gson, GsonBuilder} import javax.ws.rs.core.MediaType.APPLICATION_JSON import javax.ws.rs._ import javax.ws.rs.core.Response import javax.ws.rs.core.MediaType import org.research.util.OptionSerializer import org.research.s3.service.resource.s3Bucket import org.glassfish.jersey.media.multipart.{FormDataParam,MultiPartFeature} @Path("/file") class UploadResource(currentBucket: s3Bucket) { val gsonb = new GsonBuilder() gsonb.registerTypeAdapter(classOf[Option[Any]], new OptionSerializer) val gson = gsonb.create @POST @Path("upload") @Produces(Array(APPLICATION_JSON)) @Consumes(Array(MediaType.MULTIPART_FORM_DATA)) // def uploadFile(): Response = { def uploadFile(@FormDataParam("file") uploadedInputStream: InputStream): Response = { /* Need code here to get a uuid for the file name Then return the uuid if we have success and of course 200 */ Response.ok.entity(currentBucket.upload("testName",uploadedInputStream,false)).build() //Response.ok().build() } }


Registre MultiPartFeature. En web.xml, agregue al servlet Jersey:

<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value> </init-param>



Tuve el mismo problema con Scala y esto me ayudó a resolverlo. Solo quiero agregar algunos detalles específicos de Scala para ayudar a cualquiera que use Dropwizard con Scala. Aquí hay un ejemplo de cómo "registrar" la MultiPartFeature en un proyecto Scala y Dropwizard.

@NotEmpty @FormDataParam("myParam") String myParam

y aquí está el código para UploadResource que realiza la carga:

@FormDataParam("myParam") @NotEmpty String myParam

Este código se refiere a un depósito de s3 pero no lo necesitas. Simplemente puede reemplazar esa llamada con código, descargue los datos de su archivo entrante a un archivo normal. scala


Tuve el mismo problema cuando intenté subir el archivo. Pasé mucho tiempo hasta que encontré una solución al problema.

1.Si cambiaste la versión de tus archivos JARs, ¡puedes tener conflictos de versión!

Limpia tus artefactos / libs y reconstruye el proyecto.

2. También debe registrar su clase UploadFileService:

register(MultiPartFeature.class); register(UploadFileService.class);

Espero que ayude a alguien y le ahorre tiempo.


Yo también obtuve la misma excepción. Hice los siguientes cambios en web.xml

<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.moxy.json.MoxyFeature;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value> </init-param>

y cambió el maillot 2.7 a 2.9. No sé qué cambio de este 2 ha resuelto el problema.