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
-
org.glassfish.jersey.media.multipart.FormDataParam
-
org.glassfish.jersey.media.multipart.FormDataContentDisposition
Aparte
Si está aquí para una
ModelValidationException
diferente, aquí hay algunos enlaces para obtener información sobre otras causas de la excepción.
- 1
- 2
- 3
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>
Si alguien está usando
@FormDataParam
con la anotación de swagger
@ApiOperation
, no funcionará (según la última versión de swagger en este momento) como se menciona aquí:
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.