2013-08-15 9 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) 

ho implementato il servizio test come questo sotto la UploadFileService:Caricamento del file utilizzando Jersey sul servizio RESTfull e La configurazione della risorsa non è modificabile?

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

e ho avuto questa eccezione per accedere:

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) 

Ambiente

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

Per la soluzione 'ResourceConfig', vedere http://stackoverflow.com/a/43926819/548473 – GKislin

risposta

45

Per poter utilizzare multipart nell'applicazione Jersey è necessario registrarsi MultiPartFeature nella propria applicazione, vale a dire:

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

Per ulteriori informazioni, consultare la sezione Multipart nella Guida dell'utente di Jersey.

Per il secondo problema riscontrato cercare di riavviare il server GlassFish, io non sono sicuro di come NetBeans vengono ricaricare l'app Jersey dopo un cambio (se questo non risolve il problema, si prega di inviare il vostro ApplicationConfig).

+0

Grazie mille! Messaggio di errore cambiato e ho trovato un errore nel mio pom.xml. Stavo usando la vecchia versione multipart nel mio pom.xml. WELD-001408 Dipendenze insoddisfatte per tipo [Provider] con qualificatori [@Default] al punto di iniezione [[BackedAnnotatedParameter] Parametro 1 di [BackedAnnotatedConstructor] @Inject public org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide (@Context Provider, Provider )] – Sami

+0

Questo potrebbe essere correlato all'utilizzo di alcuni bit di Jersey 2.x nel proprio '.war' (mentre sono su classpath GF allo stesso tempo). Puoi marcare l'artefatto di 'jersey-media-multipart' nel tuo pom.xml come previsto? Fa già parte di GF 4.0. –

+0

E 'stato così !! Ora sta funzionando! org.glassfish.jersey.media jersey-media-multipart 2,2 fornito Sami

31

Ho avuto lo stesso problema e volevo evitare di creare una classe di applicazione personalizzata. Non è ben documentato, ma se si desidera aggiungere funzionalità più parti, tutto quello che dovete fare è aggiungere questo al vostro web.xml Maglia servlet config:

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

Ho anche aggiunto un loggingfilter.

+0

La tua soluzione è MEGLIO! –

+1

Non riesco a farlo funzionare. Ha bisogno di essere da qualche parte in ordine specifico? Hai una sfumatura del tuo intero pom per caso? – streetlight

+0

Questo è l'approccio più semplice e funziona come un incantesimo! Altamente raccomandato! – Ozil

0

Proprio minore chiarimento

Usa

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

Non

com.sun.jersey.* 

ha funzionato per me solo quando utilizzato org.glassfish.jersey.media.multipart.*

In ApplicationConfig basta registrarsi MultiPartFeature come

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

Hlleo guys, sto usando il server wildfly, posso usare import org.glassfish.jersey.media.multipart. * Nel mio ApplicationConfig, se sì puoi dire qual è la dipendenza che dovrei aggiungere nel mio pom.xml, perché Sto ottenendo questo errore nel mio progetto: javax.ws.rs.NotSupportedException: Impossibile trovare il body reader del messaggio per tipo: class com.sun.jersey.core.header.FormDataContentDisposizione del tipo di contenuto: multipart/form-data ;, thak you you in avanzato. – James

2

Se si utilizza il server molo e jersey servlet, allora si può risolvere questo problema aggiungendo il seguente codice nella classe principale, in cui è stato avviato il server molo,

ServletHolder jerseyServlet = contesto. 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

È possibile utilizzare @FormDataParam ("file") l'equivalente di FormDataMultiPart se si desidera utilizzando annotazione.

Usato come indicato di seguito l'estratto codice di esempio:

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

sto usando Jersey 1.9.1. org.glassfish ...... funziona bene con Jersey 2. Per Jersey 1 è meglio usare le classi com.sun ....

+1

Invece di aggiungere due post per la risposta, ti suggerisco di modificare il post del tuo primo tentativo di rispondere alla domanda (ad esempio [questo post] (http://stackoverflow.com/a/42960464/3519000)). Grazie. – lrnzcig