2013-04-09 10 views
7

Sto ottenendo il seguente errore:Jersey RIPOSO WS Errore: "Missing dipendenza per il metodo ... al parametro di indice X"

Apr 09, 2013 12:24:26 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
SEVERE: 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.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 0 
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 1 
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 2 
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 3 
SEVERE: Method, public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String), annotated with POST of resource, class com.package.ImportService, is not recognized as valid resource method. 

Ho un metodo POST in precedenza di lavoro che richiede i dati a più parti (un upload di file) e poi alcuni altri campi di dati String dal modulo inviato, ecco il codice:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream, 
    @FormDataParam("file") FormDataContentDisposition fileDetail, 
    @FormDataParam("param1") String param1, 
    @FormDataParam("param2") String param2, 
    @FormDataParam("param3") String param3) { 
    .... 
    .... 
    return Response.status(200).entity(getEntity()).build(); 
} 

l'errore sembra essere correlato al modo in cui i parametri del modulo vengono interpretati da Jersey. ecco il codice che non riesce:

@POST 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
@Path("/local") 
public Response specifyLocalFile(
    @FormDataParam("file") String fullFilePath, 
    @FormDataParam("param1") String param1, 
    @FormDataParam("param2") String param2, 
    @FormDataParam("param3") String param3) { 
    .... 
    .... 
    return Response.status(200).entity(getEntity()).build(); 
} 

risposta

11

Dopo googling un po 'finisco per rivedere alcuni casi interessanti, come ad esempio Failed unmarshalling issue with @FormParam, o Missing mulipart JAR dependency issue il post più indicativi per il mio problema era questo: "Missing dependecy for method", che rispondo con un collegamento a questo POST, poiché non vedo alcuna soluzione corrente per quello specifico.

Il problema sembrava essere correlato all'annotazione @FormDataParam, se utilizzato con l'annotazione a livello di metodo @Consumes con il valore MediaType.APPLICATION_FORM_URLENCODED.

Quando ho modificato la firma del metodo per annotare ogni campo di testo semplice con @FormParam, l'eccezione era scomparsa. Controllare il codice fisso di seguito:

@POST 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
@Path("/local") 
public Response specifyLocalFile() 
    @FormParam("file") String fullFilePath, 
    @FormParam("param1") String param1, 
    @FormParam("param2") String param2, 
    @FormParam("param3") String param3) { 
    .... 

Se il tipo di dati che vengono ricevuti non ha a che fare con MIME-codifiche, l'annotazione @FormParam tenterà di affrontare i contenuti tramite la serializzazione; al contrario, l'annotazione @FormDataParam richiede una gestione specifica che viene configurata quando l'annotazione @Consumes ha lo MediaType.MULTIPART_FORM_DATA. Spero che questo ti aiuti.

3

Ho avuto lo stesso errore sul mio progetto.

1) è necessario inserire tutte le dipendenze del jersey nella stessa versione.

2) Ho avuto anche problemi a causa della anotations spavalderia @ApiParam:

@ApiParam(value = "import file", required = true) @FormDataParam("file") InputStream inputStreamCsv 

loro rimozione ha fatto il trucco:

@FormDataParam("file") InputStream inputStreamCsv 

ecco il link mentionning il problema: https://github.com/swagger-api/swagger-core/issues/1530

Infine, tutto ha funzionato con questo:

@POST 
@Path("/import") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response import(
     @FormDataParam("file") InputStream inputStreamCsv, 
     @FormDataParam("file") FormDataContentDisposition detailsFichier) {...} 
+0

Rimuovere le annotazioni di spavalderia ha fatto il trucco per me. Grazie. –