2012-06-28 10 views
5

que estoy tratando de publicar datos de imagen a un punto final de la costura + RESTeasy y estoy recibiendo un error muy críptica durante el inicio de JBoss. La solicitud HTTP que estoy enviando tiene un tipo de contenido de multipart/form-data que tiene una sola parte de imagen/jpeg con el nombre "archivo adjunto". Mi método de servicio es el siguiente:Publicación de datos de formularios de varias partes de la costura + RESTeasy falla cálculo de referencias a InputStream

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

El error que consigo es durante el inicio:

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) [:] 

Mi entendimiento es que los tipos de medios cabría contar automáticamente a InputStream. También probé java.io.File, java.io.Reader, ambos con el mismo error. Cuando lo reemplazo con byte [] o String, obtengo una matriz de longitud cero, o nulo como valor del parámetro.

¿cómo usted va sobre la depuración de esto? Además, ¿es posible acceder a la solicitud sin procesar o a los valores preorganizados?

Cualquier sugerencia aquí sería muy apreciada.

+0

hi Tyler, ¿se soluciona esto? Iv tiene un problema muy similar – DaveB

+0

Hola Dave, lo siento, solo estaba experimentando y no terminé necesitando profundizar más. ¡Buena suerte! – tyler

Respuesta

0

Usted debe recuperar el contenido usando MultipartFormDataInput. Véase el siguiente ejemplo:

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

El método extractFilename es un método de ayuda que 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; 
} 
Cuestiones relacionadas