2015-06-04 14 views
27

Sto utilizzando la strategia di implementazione del servizio restful basata su Jersey per creare un servizio che verrà utilizzato per caricare i file. Il mio nome classe di servizio è: UploadFileService.java (vedi codice qui sotto)MULTIPART_FORM_DATA: Nessuna fonte di iniezione trovata per un parametro di tipo public 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(); 
     } 

    } 

} 

Questi sono i file JAR che ho dentro il mio 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 

sto ottenendo il seguente errore quando provo a caricare il mio server 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=[[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) 

Su internet Ho trovato che ci sono molti esempi che mostrano come caricare file MULTIPART usando l'API RESTFul. Ma con la stessa soluzione. Non sono in grado di eseguire anche questo codice. Penso che stia facendo qualcosa di sbagliato con i file JAR. Qualcuno potrebbe aiutarmi per favore su questo?

risposta

90

Sbarazzarsi di jersey-multipart-1.18.jar. Questo è per Jersey 1.x. Aggiungere questi due

Per Maven si può usare questa

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

allora avete bisogno di configurare/registrare il MultiPartFeature. Se si utilizza un ResourceConfig per la configurazione, si può semplicemente fare

register(MultiPartFeature.class); 

Se si utilizza web.xml, quindi è possibile aggiungere la classe come un <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> 

UPDATE

Inoltre, una volta eliminato lo jersey-multipart-1.18.jar, si avranno errori di compilazione per le classi importate mancanti. Per la maggior parte, i nomi di classe sono sempre gli stessi, solo i pacchetti sono cambiati, cioè

+4

Più 1 per web.xml e ResourceConfig. – kyle

+0

Wow questo ha risolto il mio problema. Grazie mille. – orange14

+1

Per utenti dropwizard. Uno deve includere la dipendenza dai moduli dropwizard e registrare il bundle nel metodo initialize(): http://dropwizard.readthedocs.io/en/latest/manual/forms.html – Vyacheslav

1

troppo ho ottenuto lo stesso exception.I ha fatto le seguenti modifiche 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> 

e ha cambiato maglia 2,7-2,9 .Io non so cosa il cambiamento di questa 2 ha risolto il problema.