2012-04-20 60 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