2012-06-28 9 views
5

イメージデータをseam + RESTeasyエンドポイントに投稿しようとしていますが、JBossの起動時に非常に不明瞭なエラーが発生します。私が送信しているHTTPリクエストには、content-typeのmultipart/form-dataがあり、image/jpegという名前の部分に「attachment」という名前が付いています。私のサービスメソッドは次のようになります。シーム+ RESTeasyへのマルチパートフォームデータのポストがInputStreamへのマーシャリングに失敗する

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

私が手にエラーが起動時に次のとおりです。

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

私の理解では、メディアタイプが自動的に入力ストリームに整列化することができることでした。私もjava.io.File、java.io.Readerを試みました - 両方とも同じエラーです。私がbyte []またはStringで置き換えると、長さがゼロの配列、またはパラメータ値としてnullが返されます。

これをデバッグするにはどうすればよいですか?また、生の要求または事前マーシャリングされた値にアクセスすることは可能ですか?

ここにご意見をいただければ幸いです。

+0

こんにちはタイラーが、あなたがこの問題を解決しましたか? Ivは非常に似た問題を抱えていた – DaveB

+0

デイヴ大佐、すみません、私は実験していて、深く掘り下げる必要はありませんでした。がんばろう! – tyler

答えて

0

MultipartFormDataInputを使用してコンテンツを取得する必要があります。

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

extractFilename方法は、ヘルパーメソッド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; 
} 
関連する問題