2013-08-25 4 views
7

Impossibile implementare il caricamento di file semplice utilizzando Jersey. Mancante errori di dipendenza sollevate al bootstrap applicazione:Impossibile implementare il caricamento di file semplice in Jersey - "annotato con POST di risorsa, classe non riconosciuta come metodo di risorsa valido. Non disponibile"

The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.foo.MyResource.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at parameter at index 0 
    SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.foo.MyResource.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at parameter at index 1 
    SEVERE: Method, public javax.ws.rs.core.Response com.foo.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), annotated with POST of resource, class com.foo.FS2Resource, is not recognized as valid resource method. 
unavailable 
com.sun.jersey.spi.inject.Errors$ErrorMessagesException 
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) 

Sembra che ci sia un problema con la mappatura dei parametri di input a un servizio REST? Ho letto la documentazione e ho seguito diversi esempi, e non mi sto allontanando da questi esempi.

Ecco il codice:

@Path("v1/") 
public class FileUploadResource { 


    @POST 
    @Path("upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    @Produces({MediaType.APPLICATION_JSON}) 
    public Response uploadFile(
     @FormDataParam("file") InputStream is, 
     @FormDataParam("file") FormDataContentDisposition detail) { 

     String name = detail.getFileName(); 

     // do upload stuff 
     String output = .... 

     return Response.status(200).entity(output).build(); 
    } 

} 

ho tirato in "compilazione 'com.sun.jersey.contribs: jersey-multipart: 1.17.1'" per i FormDataParams.

EDIT: ero in grado di farlo funzionare a Jersey, ma solo in questo più primitivo di moda:

@POST 
@Path("upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA)  
@Produces(MediaType.TEXT_PLAIN) 

public Response uploadFile(final MimeMultipart file) { 
    if (file == null) { 
    return Response.status(Response.Status.BAD_REQUEST).entity("Must supply a valid file").build(); 

    try { 
    for (int i = 0; i < file.getCount(); i++) { 
     // ... do something with file.getBodyPart(i)); 
    } 
    return Response.ok("done").build(); 
    } catch (final Exception e) { 
    return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e).build(); 
    } 
} 

Questa è probabilmente una soluzione sufficiente, ma desidera comunque andare a fondo della problema.

+0

realtà sto correndo in un problema simile. Ho la stessa versione corrispondente di tutti i jersey jersey richiesti e ognuno dei miei valori di FormDataParam è diverso per evitare il problema di mappatura futura. Tuttavia, ho ancora il problema del bootstrap. C'è un problema con l'uso delle annotazioni Post e Produces insieme o qualcosa del genere? L'unico metodo con cui ho avuto questo problema è il mio Post. –

+0

Mi è stato detto da un collega che si tratta di un bug noto e che la ragione per cui funziona è che ha a che fare con la distribuzione/configurazione specifica con cui si sta lavorando. –

+0

Un bug su cosa, esattamente? L'annotazione FormDataParam o Jersey? –

risposta

9

Ho avuto lo stesso problema.

Era un problema di versione (avevo 1.8 in jersey.multipart e 1.17.1 nel resto della maglia). Impostandoli tutti a 1.17.1 workrd per mee.

Ha preso la mia risposta da qui:

Missing dependency for method when doing a file upload rest web service

+1

Perfecto bro ... ottima risposta, ha funzionato come un proiettile, questo è lo stesso problema con me, ho usato 1.8 e 1.17.1 entrambi, ottimo (applauso) –

1

Un problema visibile nel codice è che, si utilizza lo stesso nome sia per l'ingresso multipart param cioè "file"

@FormDataParam("file") 

params più parti hanno un identificatore, quindi è necessario utilizzare la corretta nome per il secondo oggetto nella firma del metodo. Altrimenti lo stesso parametro sta andando in inputstream e anche per FormDataContentDisposition.

+0

Questo ha un senso, ma questo è un problema di bootstrap e non di runtime. Inoltre, JavaDoc per FormDataParam suggerisce effettivamente di utilizzare "file" in entrambi i casi. –

+0

@rob il documento che stai seguendo è sbagliato. Non è possibile mappare correttamente due parametri multipart con lo stesso nome. Prova a cambiare il nome dei parametri del modulo nel client e usa lo stesso nome nel tuo metodo. –

+0

Ho cambiato i nomi per farti umorare e vedere ancora lo stesso problema. Ricorda, questo è bootstrap ... il client non ha nulla a che fare con questo problema. Sta succedendo all'avvio * del container. Sarei felice di occuparmi di problemi di mappatura a questo punto, ma sfortunatamente non ci sono ancora. :) –

Problemi correlati