2015-06-04 13 views
27

Ich verwende die Jersey-basierte Restful-Service-Implementierungsstrategie, um einen Service zu erstellen, der zum Hochladen von Dateien verwendet wird. Mein Service Klassenname: UploadFileService.java (Siehe unten-Code)MULTIPART_FORM_DATA: Es wurde keine Injektionsquelle für einen Parameter vom Typ public gefunden javax.ws.rs.core.Response

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(); 
     } 

    } 

} 

Dies sind die JAR-Dateien, die ich in meinem lib habe:

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 folgenden Fehler wenn ich versuche, meinen tomcat server aufzusuchen:

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=[[email protected]]}, 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 Ich fand, es gibt viele Beispiele, die zeigen, wie MULTIPART-Datei mit RESTFul API hochladen. Aber mit der gleichen Lösung. Ich kann diesen Code nicht ausführen. Ich denke, ich mache etwas falsch mit den JAR-Dateien. Könnte mir bitte jemand dabei helfen?

Antwort

90

jersey-multipart-1.18.jar loswerden. Das ist für Jersey 1.x. Fügen Sie diese zwei

Für Maven würden Sie diese verwenden

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

Dann müssen Sie konfigurieren/die MultiPartFeature registrieren. Wenn Sie eine ResourceConfig zur Konfiguration verwenden, können Sie einfach tun

register(MultiPartFeature.class); 

Wenn Sie web.xml verwenden, dann können Sie die Klasse als <init-param> zum Servlet Jersey hinzufügen

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

UPDATE

Wenn Sie einmal jersey-multipart-1.18.jar loswerden, werden Sie Kompilierungsfehler für die fehlenden importierten Klassen haben. Zum größten Teil sind die Klassennamen immer noch die gleichen, nur die Pakete haben sich geändert, dh

+4

Plus 1 für web.xml und ResourceConfig. – kyle

+0

Wow, das hat mein Problem gelöst. Tausend Dank. – orange14

+1

Für Dropwizard Benutzer. Man muss die Dropwizard-Forms-Abhängigkeit einschließen und das Bundle in der initialize() - Methode registrieren: http://dropwizard.readthedocs.io/en/latest/manual/forms.html – Vyacheslav

1

Ich habe auch das gleiche exception.I die folgenden Änderungen haben in 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> 

und verändert Trikot 2,7-2,9 .Ich weiß nicht, welche Änderung dieser 2 das Problem gelöst hat.