Post 将多部分表单数据发布到seam+;RESTeasy无法编组到InputStream

Post 将多部分表单数据发布到seam+;RESTeasy无法编组到InputStream,post,jboss,resteasy,multipartform-data,Post,Jboss,Resteasy,Multipartform Data,我试图将图像数据发布到seam+RESTeasy端点,在JBoss启动过程中遇到了一个非常隐秘的错误。我发送的HTTP请求有一个多部分/表单数据的内容类型,它有一个名为“附件”的图像/jpeg部分。我的服务方法如下所示: @POST @Path("uploadSymptomsImage/{appointmentGUID}") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces("application/json") public String u

我试图将图像数据发布到seam+RESTeasy端点,在JBoss启动过程中遇到了一个非常隐秘的错误。我发送的HTTP请求有一个多部分/表单数据的内容类型,它有一个名为“附件”的图像/jpeg部分。我的服务方法如下所示:

@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.lang.RuntimeException:在public java.lang.String com上找不到为javax.ws.rs.FormParam(“附件”)获取String param或valueOf()或fromString()方法的构造函数…AppointmentRestService.UploadSymplesImage(java.io.InputStream,java.lang.String)的基类型:java.io.InputStream
位于org.jboss.resteasy.core.StringParameterInjector.initialize(StringParameterInjector.java:206)[:]
位于org.jboss.resteasy.core.StringParameterInjector.(StringParameterInjector.java:57)[:]
在org.jboss.resteasy.core.FormParamInjector.(FormParamInjector.java:22)[:]
我的理解是,媒体类型可以自动编组到InputStream。我还尝试了java.io.File和java.io.Reader——两者都有相同的错误。当我替换为byte[]或String时,我得到一个零长度数组,或者null作为参数值

您将如何进行调试?另外,是否可以访问原始请求或预封送的值


如有任何建议,将不胜感激

您应该使用检索内容。请参见以下示例:

@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
}
@POST
@路径(“UploadSymplesImage/{appointmentGUID}”)
@使用(MediaType.MULTIPART\u FORM\u数据)
@生成(“应用程序/json”)
公共字符串UploadSymplesImage(@PathParam(“appointmentGUID”)字符串StrapointmentGuid,
MultipartFormDataInput(输入formData){
Map formDataMap=formData.getFormDataMap();
列表附件=formDataMap.get(“附件”);
用于(InputPart附件:附件){
字符串文件名=提取文件名(附件);
如果(fileName.isEmpty())继续;
InputStream in=attachment.getBody(新的GenericType(){});
//与流交互
}
//回应
}
extractFilename方法是辅助方法I:

private静态字符串提取文件名(最终InputPart附件){
先决条件。checkNotNull(附件);
多值Map headers=attachment.getHeaders();
字符串contentDispositionHeader=headers.getFirst(“内容处置”);
先决条件.checkNotNull(contentDispositionHeader);
用于(字符串标题部分:contentDispositionHeader.split(“;(\\s)+”)){
String[]split=headerPart.split(“=”);
if(split.length==2&&split[0].equalsIgnoreCase(“文件名”)){
返回拆分[1]。替换(“\”,“”);
}
}
返回null;
}

嗨,泰勒,你解决了这个问题吗?我遇到了一个非常类似的问题嘿,戴夫,对不起,我只是在试验,没有深入研究。祝你好运!
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;
}