2012-06-28 32 views
5

Tôi đang cố đăng dữ liệu hình ảnh lên đường may + Điểm cuối RESTeasy và tôi gặp phải một lỗi rất khó hiểu khi khởi động JBoss. Yêu cầu HTTP tôi gửi có loại nội dung của dữ liệu nhiều phần/biểu mẫu có một phần hình ảnh/jpeg có tên "tệp đính kèm". phương pháp dịch vụ của tôi trông như thế này:Đăng dữ liệu đa dạng dữ liệu lên đường may + RESTeasy không kết hợp với InputStream

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

Các lỗi mà tôi nhận được là trong quá trình startup:

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

sự hiểu biết của tôi là loại phương tiện truyền thông có thể được tự động marshalled để InputStream. Tôi cũng đã thử java.io.File, java.io.Reader - cả hai đều có cùng lỗi. Khi tôi thay thế bằng byte [] hoặc String, tôi nhận được một mảng có độ dài bằng không, hoặc null là giá trị tham số.

Bạn sẽ gỡ lỗi như thế nào? Ngoài ra, có thể truy cập yêu cầu thô hoặc các giá trị được sắp xếp trước không?

Mọi đề xuất ở đây sẽ được đánh giá cao.

+0

hi tyler, sao bạn giải quyết này? Iv có một vấn đề rất giống nhau – DaveB

+0

Hey Dave, xin lỗi tôi đã thử nghiệm và không cần phải đào sâu hơn nữa. Chúc may mắn! – tyler

Trả lời

0

Bạn nên truy xuất nội dung bằng cách sử dụng MultipartFormDataInput. Xem ví dụ sau:

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

Phương pháp extractFilename là một phương pháp helper tô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; 
} 
Các vấn đề liên quan