2012-06-28 3 views
5

Sto provando a postare dati di immagine su una giunzione + RESTeasy endpoint e sto ricevendo un errore molto criptico durante l'avvio di JBoss. La richiesta HTTP che sto inviando ha un tipo di contenuto di multipart/form-data che ha una singola immagine/parte jpeg con il nome "attachment". Il mio metodo di servizio simile a questa:Invio di dati di modulo multipart a Seam + RESTeasy fallisce il marshalling su InputStream

@POST 
@Path("uploadSymptomsImage/{appointmentGUID}") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces("application/json") 
public String uploadSymptomsImage(@FormParam("attachment") InputStream fileInputStream, 
            @PathParam("appointmentGUID") String strAppointmentGUID) 
{ ... 

L'errore che ottengo è durante l'avvio:

Caused by: java.lang.RuntimeException: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.FormParam("attachment") on public java.lang.String com....AppointmentRestService.uploadSymptomsImage(java.io.InputStream,java.lang.String) for basetype: java.io.InputStream 
at org.jboss.resteasy.core.StringParameterInjector.initialize(StringParameterInjector.java:206) [:] 
at org.jboss.resteasy.core.StringParameterInjector.<init>(StringParameterInjector.java:57) [:] 
at org.jboss.resteasy.core.FormParamInjector.<init>(FormParamInjector.java:22) [:] 

La mia comprensione è che i tipi di supporto potrebbero essere schierate automaticamente InputStream. Ho anche provato java.io.File, java.io.Reader - entrambi con lo stesso errore. Quando sostituisco con byte [] o String ottengo un array di lunghezza zero, o null come valore del parametro.

Come procedere nel debug di questo? Inoltre, è possibile accedere alla richiesta non elaborata o ai valori pre-marshalling?

Qualsiasi suggerimento qui sarebbe molto apprezzato.

+0

hi Tyler, avete risolto questo? Iv ha avuto un problema molto simile – DaveB

+0

Hey Dave, scusa stavo solo sperimentando e non ho finito per dover scavare più a fondo. In bocca al lupo! – tyler

risposta

0

È necessario recuperare il contenuto utilizzando MultipartFormDataInput. Vedere l'esempio seguente:

@POST 
@Path("uploadSymptomsImage/{appointmentGUID}") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces("application/json") 
public String uploadSymptomsImage(@PathParam("appointmentGUID") String strAppointmentGUID, 
           MultipartFormDataInput formData) { 

    Map<String, List<InputPart>> formDataMap = formData.getFormDataMap(); 

    List<InputPart> attachments = formDataMap.get("attachment"); 
    for(InputPart attachment : attachments) { 
     String fileName = extractFilename(attachment); 
     if(fileName.isEmpty()) continue; 
     InputStream in = attachment.getBody(new GenericType<InputStream>() {}); 
     // Interact with stream 
    } 

    // Respond 
} 

Il metodo extractFilename è un metodo di supporto I wrote:

private static String extractFilename(final InputPart attachment) { 
    Preconditions.checkNotNull(attachment); 
    MultivaluedMap<String, String> headers = attachment.getHeaders(); 
    String contentDispositionHeader = headers.getFirst("Content-Disposition"); 
    Preconditions.checkNotNull(contentDispositionHeader); 

    for(String headerPart : contentDispositionHeader.split(";(\\s)+")) { 
     String[] split = headerPart.split("="); 
     if(split.length == 2 && split[0].equalsIgnoreCase("filename")) { 
      return split[1].replace("\"", ""); 
     } 
    } 

    return null; 
} 
Problemi correlati