web-dev-qa-db-ger.com

MULTIPART_FORM_DATA: Für einen Parameter des Typs public javax.ws.rs.core.Response wurde keine Injektionsquelle gefunden

Ich verwende eine auf Jersey basierende restful Service-Implementierungsstrategie, um einen Service zu erstellen, der zum Hochladen von Dateien verwendet wird . Mein Name der Serviceklasse lautet: 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();
        }

    }

}

Dies sind die JAR-Dateien, die ich in meiner Bibliothek 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 folgende Fehlermeldung, wenn ich versuche, meinen Tomcat-Server hochzufahren:

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 habe ich viele Beispiele gefunden, die zeigen, wie eine MULTIPART-Datei mithilfe der RESTFul-API hochgeladen wird. Aber mit der gleichen Lösung. Ich kann diesen Code auch nicht ausführen ... Ich glaube, ich mache etwas falsch mit den JAR-Dateien. Könnte mir bitte jemand dabei helfen?

38
Swarup Saha

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

Für Maven würden Sie die folgende Abhängigkeit verwenden (Sie müssen die Abhängigkeit von mimepull nicht explizit hinzufügen, da diese durch die Abhängigkeit eingezogen wird).

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

Dann müssen Sie die MultiPartFeature registrieren. Wenn Sie eine ResourceConfig für die Konfiguration verwenden, können Sie dies einfach tun

register(MultiPartFeature.class);

Wenn Sie web.xml verwenden, können Sie die Klasse als <init-param> zum Jersey-Servlet 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>

Wenn Sie über mehrere Anbieter verfügen, die Sie registrieren möchten, können Sie jede Anbieterklasse mit einem Komma oder einem Semikolon voneinander abgrenzen. Sie können diesen param-name nicht zweimal verwenden. Siehe Suarabhs Antwort

UPDATE

Sobald Sie jersey-multipart-1.18.jar entfernt haben, werden Kompilierungsfehler für die fehlenden importierten Klassen auftreten. Meistens sind die Klassennamen immer noch gleich, nur die Pakete haben sich geändert, d. H. 


Beiseite

Wenn Sie sich hier für eine andere ModelValidationException befinden, finden Sie hier einige Links zu weiteren Ursachen der Ausnahme.

122
Paul Samsotha

Ich habe auch die gleiche Ausnahme. Ich habe die folgenden Änderungen in web.xml vorgenommen

<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 wechselte das Trikot von 2.7 auf 2.9. Ich weiß nicht, welche Änderung von dieser 2 das Problem gelöst hat.

3
Saurabh

Registrieren Sie MultiPartFeature. .__ In web.xml fügen Sie dem Jersey-Servlet Folgendes hinzu:

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

Eine weitere mögliche Ursache für diesen sehr allgemeinen Fehler besteht darin, dass Jersey nur nach Fabriken sucht, die der letzten Anmerkung zugeordnet sind, wenn mehrere Parameter für einen Parameter deklariert sind. (Siehe Fehlerbericht )

Bis dies behoben ist, müssen Sie, wenn Sie neben @FormDataParam noch weitere Anmerkungen verwenden, diese als letztes erhalten.

Das funktioniert:

@NotEmpty @FormDataParam("myParam") String myParam

Das tut nicht:

@FormDataParam("myParam") @NotEmpty String myParam
0

Ich hatte das gleiche Problem, als ich versuchte, die Datei hochzuladen. Ich habe viel Zeit damit verbracht, eine Lösung für das Problem zu finden.

1.Wenn Sie die Version Ihrer JAR-Dateien geändert haben, kann es zu Versionskonflikten kommen!

Bereinigen Sie Ihre Artefakte/Bibliotheken und erstellen Sie das Projekt neu.

2.Sie müssen auch Ihre UploadFileService-Klasse registrieren:

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

Hoffe es hilft jemandem und spart eure Zeit.

0

Ich hatte das gleiche Problem mit Scala und dieses half mir, es zu lösen. Sie möchten nur einige Scala-spezifische Details hinzufügen, um jedem zu helfen, der Dropwizard mit Scala verwendet. Hier ein Beispiel, wie Sie das MultiPartFeature in einem Scala- und Dropwizard-Projekt "registrieren" können.

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: _*)
}

und hier ist der Code für die UploadResource, die den Upload durchführt:

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

}

Dieser Code bezieht sich auf einen S3-Bucket, aber Sie brauchen das nicht. Sie können diesen Anruf einfach durch Code ersetzen, indem Sie Ihre eingehenden Dateidaten in eine reguläre Datei herunterladen scala

0
markgp

Wenn jemand @FormDataParam mit @ApiOperation swagger-Annotation verwendet, funktioniert dies (wie in der aktuellsten swagger-Version zu diesem Zeitpunkt) nicht, wie hier erwähnt:

https://github.com/swagger-api/swagger-ui/issues/169

0