2012-04-20 81 views
1

我想上传一个JPG文件和一个JSON序列化的Java对象。在我使用Apache CXF的服务器上,在客户端上,我正在使用rest-assured进行集成测试。带CXF的JAX-RS/rest-assured:处理多参数文件上传

我的服务器代码如下所示:

@POST 
@Path("/document") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response storeTravelDocument(
     @Context UriInfo uriInfo, 
     @Multipart(value = "document") JsonBean bean, 
     @Multipart(value = "image") InputStream pictureStream) 
     throws IOException 
{} 

我的客户端代码如下所示:

given(). 
    multiPart("document", new File("./data/json.txt"), "application/json"). 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 
expect(). 
    statusCode(Response.Status.CREATED.getStatusCode()). 
when(). 
    post("/document"); 

一切,当我读了JSON部分从文件中第一行多工作正常。但是,当我想序列化json实例时,我遇到了问题。我尝试了很多变种,但都没有奏效。

我想这应该变种工作:客户端

JsonBean json = new JsonBean(); 
json.setVal1("Value 1"); 
json.setVal2("Value 2"); 

given(). 
    contentType("application/json"). 
    formParam("document", json). 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 
... 

和服务器

public Response storeTravelDocument(
    @Context UriInfo uriInfo, 
    @FormParam(value = "document") JsonBean bean, 
    @Multipart(value = "image") InputStream pictureStream) 

上却没有。谁能告诉我应该如何?

回答

0

Multipart/form-data遵循多部分MIME数据流的规则,请参阅w3.org。这意味着请求的每个部分都构成流中的一部分。 Rest-assured支持已经简单的字段(字符串),文件和流,但不会将对象序列化为一个部分。在邮件列表上询问后,Johan Haleby(作者放心)建议添加一个问题。该问题已被接受,请参见issue 166

服务器将保持,因为它是:

@POST 
@Path("/document") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response storeTravelDocument(
     @Context UriInfo uriInfo, 
     @Multipart(value = "document") JsonBean bean, 
     @Multipart(value = "image") InputStream pictureStream) 
     throws IOException 
{} 

客户端代码如下:

given(). 
    multiPartObject("document", objectToSerialize, "application/json"). 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 
expect(). 
    statusCode(Response.Status.CREATED.getStatusCode()). 
when(). 
    post("/document"); 

也许名为 “multiPartObject” 将改变。我们会看到它一旦实施。

1

尝试不同的方法(为我工作),我不知道这是否适合您的情况。

使JsonBean成为JAXB实体,它将@XmlRootEntity添加到类定义之上。

然后,而不是formParam

given(). 
    contentType("application/json"). 
    body(bean). //bean is your JsonBean 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 

然后

public Response storeTravelDocument(
    @Context UriInfo uriInfo, 
    JsonBean bean, //should be deserialized properly 
    @Multipart(value = "image") InputStream pictureStream) 

我从来没有尝试过与@Multipart部分,但是,希望它会工作。

+0

感谢您的帮助!尝试之前(不是与JAXB,但没有工作,你不能混用body和multiPart。它没有工作的原因也可以是http://code.google.com/p/rest-assured/issues/详细信息?id = 167我们将在下一个版本中看到rest-assured。 – ChrLipp 2012-04-26 14:05:01

+0

运气不好然后:(抱歉,我忍不住 – 2012-04-26 18:11:39

+0

没问题!谢谢! – ChrLipp 2012-04-27 05:39:05