2013-08-15 4 views
33
@Path("file.upload") 
public class UploadFileService { 
@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
     @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetail) { 

    System.out.println("-----------------UploadFileService------------------1."); 
    // Should we use a disk or DB? Decided to use DISK 
    // Path should be read from properties-files 
    String uploadedFileLocation = "//uploaded/" + fileDetail.getFileName(); 

    // save it 
    writeToFile(uploadedInputStream, uploadedFileLocation); 

    String output = "File uploaded to : " + uploadedFileLocation; 
    // All went OK 
    return Response.status(200).entity(output).build(); 

} 
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0. 

SEVERE: WebModule[/insame]StandardWrapper.Throwable 
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.insame.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=MethodHandler{handlerClass=class com.insame.service.UploadFileService, handlerConstructors=[[email protected]]}, handlingMethod=public javax.ws.rs.core.Response com.insame.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:410) 
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:157) 
    at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:280) 
    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:277) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 

Ich implementierte Test Service wie dies unter dem UploadFileService:Datei mit Jersey über RESTfull-Service hochladen und die Ressourcenkonfiguration ist nicht änderbar?

@GET 
@Path("count") 
@Produces("text/plain") 
public String countREST() { 
    return "1 one 1"; 
} 

und ich habe diese Ausnahme zu protokollieren:

FINE: [Web-Security] hasResource perm: ("javax.security.jacc.WebResourcePermission" 

"/webresources/file.upload/count" "GET") 
SEVERE: WebModule[/insame]StandardWrapper.Throwable 
java.lang.IllegalStateException: The resource configuration is not modifiable in this context. 
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257) 
WARNING: StandardWrapperValve[com.insame.service.ApplicationConfig]: Allocate exception for servlet com.insame.service.ApplicationConfig 
java.lang.IllegalStateException: The resource configuration is not modifiable in this context. 
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257) 
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205) 
    at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) 

Umwelt

  • Netbeans7.3.1
  • Glassfish 4.0
  • Jersey 2 mit Glassfish 4,0
+0

Für 'ResourceConfig' Lösung siehe http://Stackoverflow.com/a/43926819/548473 – GKislin

Antwort

45

Um mehrt in Ihrer Jersey-Anwendung verwenden Sie MultiPartFeature in Ihrer Anwendung, das heißt registrieren müssen:

public class ApplicationConfig extends Application { 

    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> resources = new HashSet<Class<?>>(); 

     // Add your resources. 
     resources.add(UploadFileService.class); 

     // Add additional features such as support for Multipart. 
     resources.add(MultiPartFeature.class); 

     return resources; 
    } 
} 

Weitere Informationen finden Sie im Abschnitt Multipart im Jersey Benutzerhandbuch.

Für die zweite Ausgabe, die Sie versuchen, den GlassFish-Server neu zu starten, bin ich nicht sicher, wie NetBeans die Jersey-App nach einer Änderung neu laden (wenn das nicht hilft, bitte posten Sie Ihre ApplicationConfig).

+0

Vielen Dank! Fehlermeldung geändert und ich habe einen Fehler in meiner pom.xml gefunden. Ich verwendete alte mehrteilige Version in meiner pom.xml. WELD-001408 Unzufriedene Abhängigkeiten für Typ [Provider] mit Qualifizierer [@Default] am Injektionspunkt [[BackedAnnotatedParameter] Parameter 1 von [BackedAnnotatedConstructor] @Inject public org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide (@Context Providers, Provider )] – Sami

+0

Dies könnte damit zusammenhängen, dass Sie einige der Jersey 2.x-Bits in Ihrem '.war' haben (während sie gleichzeitig im GF-Classpath sind). Kannst du 'jersey-media-multipart' Artefakt in deiner pom.xml wie angegeben markieren? Es ist bereits ein Teil von GF 4.0. –

+0

Das war es !! Jetzt funktioniert es! org.glassfish.jersey.media Jersey-media-mehrteiliger 2,2 bereitgestellt Sami

31

Ich hatte das gleiche Problem und wollte vermeiden, eine benutzerdefinierte Anwendungsklasse zu erstellen. Es ist nicht gut dokumentiert, aber wenn Sie Multipart-Funktionalität hinzufügen wollen, alles, was Sie tun müssen, ist diese Konfiguration zu Ihrer web.xml Jersey Servlet hinzufügen:

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

ich auch eine loggingfilter hinzugefügt.

+0

Ihre Lösung ist das Beste! –

+1

Ich kann das auch nicht zur Arbeit bringen. Muss es irgendwo in der Reihenfolge sein? Hast du zufällig einen Kern deines gesamten Poms? – streetlight

+0

Dies ist der einfachste Ansatz und funktioniert wie ein Charme! Sehr empfehlenswert! – Ozil

0

nur geringfügige Klärung

Verwenden

import org.glassfish.jersey.media.multipart.MultiPartFeature 
import org.glassfish.jersey.media.multipart.FormDataContentDisposition; 
import org.glassfish.jersey.media.multipart.FormDataParam; 

Nicht

com.sun.jersey.* 

Hat Arbeit für mich nur verwendet, wenn org.glassfish.jersey.media.multipart.*

In ApplicationConfig registrieren MultiPartFeature als

import org.glassfish.jersey.media.multipart.MultiPartFeature; 

@javax.ws.rs.ApplicationPath("webresources") 
public class ApplicationConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     resources.add(UploadFileService.class); 
     resources.add(MultiPartFeature.class); 
     return resources; 
    } 
} 
+0

Hallo Leute, ich benutze Wildfly Server, kann ich importieren org.glassfish.jersey.media.multipart. * In meiner ApplicationConfig, wenn ja, können Sie sagen, was ist die Abhängigkeit, die ich in meiner pom.xml hinzufügen sollte, weil Ich erhalte diesen Fehler in meinem Projekt: javax.ws.rs.NotSupportedException: Konnte Nachrichtenleser für Typ nicht finden: Klasse com.sun.jersey.core.header.FormDataContentDisposition des Inhaltstyps: multipart/form-data ;, thak you im fortgeschrittenen Stadium. – James

2

Wenn Sie Anlegesteg Server und Jersey-Servlet verwenden, dann können Sie dieses Problem lösen, indem Sie den folgenden Code in der Hauptklasse hinzugefügt, wo Sie den Anlegesteg-Server gestartet haben,

ServletHolder jerseyServlet = Kontext. addServlet ( org.glassfish.jersey.servlet.ServletContainer.class, "/ *"); JerseyServlet.setInitOrder (0);

 // Tells the Jersey Servlet which REST service/classes to load. 
     jerseyServlet 
       .setInitParameter(
         "jersey.config.server.provider.classnames", 
         <Your entry point class's canonical name> 
           + ";org.glassfish.jersey.media.multipart.MultiPartFeature"); 
-1

Sie können @FormDataParam ("Datei") Äquivalent FormDataMultiPart verwenden, wenn Sie es Anmerkung mit wollen.

verwendet, wie unten Beispielcode Extrakt gegeben:

public Response uploadFile(**@FormDataParam("file")** InputStream fileInputStream, 
      @FormDataParam("file") FormDataContentDisposition contentDispositionHeader) { 
0

Ich verwende Jersey 1.9.1. org.glassfish ... funktioniert gut mit Jersey 2. Für Jersey 1 solltest du besser com.sun ... classes verwenden.

+1

Anstatt zwei Posts für Ihre Antwort hinzuzufügen, würde ich vorschlagen, dass Sie Ihren Post von Ihrem ersten Versuch bearbeiten, die Frage zu beantworten (z. B. [this post] (http://stackoverflow.com/a/42960464/3519000)). Vielen Dank. – lrnzcig

Verwandte Themen