MULTIPART_FORM_DATA: Keine Injektion Quelle gefunden für einen parameter vom Typ public javax.ws.rs.core.Antwort
Ich bin mit Jersey-basierten restful-Service-Implementierung Strategie zu bauen ist eine Dienstleistung, die verwendet werden, um Dateien hochzuladen.
Mein service class name : UploadFileService.java (Siehe Code unten)
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();
}
}
}
Diese sind die JAR-Dateien, die ich in meiner 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
Ich erhalte die folgende Fehlermeldung, wenn ich versuche, meine tomcat-server :
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)
Über das internet habe ich gefunden, es gibt viele Beispiel, das zeigt, Wie hoch MULTIPART-Datei mit RESTFul API. Aber mit der gleichen Lösung. Ich bin nicht in der Lage zu führen Sie diesen code als auch.
Ich denke, ich mache etwas falsch mit den JAR-Dateien. Könnte jemand mir bitte helfen?
InformationsquelleAutor Swarup Saha | 2015-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Loszuwerden
jersey-multipart-1.18.jar
. Das ist für Jersey-1.x. Fügen Sie diese beidenFür Maven verwenden Sie die folgende Abhängigkeit (Sie müssen nicht explizit hinzufügen, die
mimepull
Abhängigkeit, wie dieses ziehen in).Dann müssen Sie sich die
MultiPartFeature
. Wenn Sie eineResourceConfig
für die Konfiguration, die Sie können einfach tunWenn Sie mit web.xml dann können Sie hinzufügen, die Klasse als
<init-param>
zu den Jersey-servletBeachten Sie, dass wenn Sie mehrere Anbieter, die Sie registrieren möchten, dann können Sie die Abgrenzung der einzelnen Anbieter-Klasse mit einem Komma oder Semikolon. Sie können diese gleichen
param-name
zweimal. Sehen Suarabh AntwortUPDATE
Auch, wenn Sie loswerden
jersey-multipart-1.18.jar
Sie haben Compiler-Fehler für die fehlenden importierten Klassen. Zum größten Teil, die Namen der Klassen sind immer noch die gleichen, nur die Pakete haben sich geändert, d.h.org.glassfish.jersey.media.multipart.FormDataParam
org.glassfish.jersey.media.multipart.FormDataContentDisposition
Beiseite
Wenn Sie hier sind für ein anderes
ModelValidationException
, hier sind einige links für Informationen über andere Ursachen für die Ausnahme.Danke so viel, und dies ist eine alternative registery HashSet h = new HashSet<Klasse<?>>(); h.add(MultiPartFeature.class);
Diese Linie
register(MultiPartFeature.class);
meinen Tag gerettetJa, wenn Sie mit einem
Application
Unterklasse, fügen Sie dieMultiPartFeature
entweder als Klasse, in der die Klassen oder als eine Instanz, um die Liste der singletons.Ich lief in dieses, zu und wollte nur zu beachten, dass der GlassFish-5.0.1-Projekt (pre-release) zum Zeitpunkt des Schreibens dieses Artikels besteht aus Jersey 2.26.
InformationsquelleAutor Paul Samsotha
Bekam ich auch die gleiche Ausnahme.Ich habe die folgenden änderungen in web.xml
verändert und jersey 2.7 bis 2.9 .Ich weiß nicht, was ändern diese 2 hat das Problem gelöst.
InformationsquelleAutor Saurabh
Wenn jemand
@FormDataParam
mit@ApiOperation
swagger Anmerkung, es wird nicht funktionieren(wie pro swagger neueste version zu diesem Zeitpunkt), wie Sie hier erwähnt:https://github.com/swagger-api/swagger-ui/issues/169
InformationsquelleAutor Anant Simran Singh
Registrieren MultiPartFeature.
In web.xml hinzufügen, um das Jersey-servlet:
InformationsquelleAutor RoutesMaps.com
Ich hatte das gleiche problem mit Scala und das half mir es zu lösen. Möchte nur hinzufügen, dass einige Scala-spezifische details, um zu helfen jemand mit Dropwizard mit Scala. Hier ist ein Beispiel, wie "registrieren" wird die MultiPartFeature in eine Scala und Dropwizard-Projekt.
und hier ist der code für die UploadResource, dass der upload:
Dieser code bezieht sich auf ein s3-bucket, aber Sie brauchen das nicht. Sie können nur ersetzen Sie den Anruf mit dem code zu tun, laden Sie Ihre eingehenden Daten einer regulären Datei.
scala
InformationsquelleAutor markgp
Noch eine weitere mögliche Ursache für diese sehr generische Fehler ist, dass Jersey sucht nur für die Fabriken in Verbindung mit den letzten Anmerkung wenn mehrere Objekte deklariert sind, auf einem param. (Siehe bug-report)
Bis dieses Problem behoben ist, wenn Sie mit anderen Anmerkungen, die neben
@FormDataParam
es muss kommen Letzte.Dies funktioniert:
Nicht:
InformationsquelleAutor Ahmad Abdelghany
Ich hatte das gleiche problem, als ich versucht habe, die Datei hochzuladen.
Ich verbrachte eine Menge Zeit, bis ich eine Lösung gefunden für das problem.
1.Wenn Sie die geänderte version Ihrer Gläser-Dateien Sie können eine version Konflikten!
2.Sie müssen sich registrieren, Ihre UploadFileService Klasse zu:
Hoffe, es wird jemand helfen und sparen Ihre Zeit.
InformationsquelleAutor Александр Юшко