带有CXF / rest-assured的JAX-RS:处理多参数文件上传

时间:2012-04-20 12:50:17

标签: cxf jax-rs rest-assured

我想上传JPG文件和JSON序列化的Java对象。在我使用Apache CXF的服务器上,在客户端上我使用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");

当我从第一个multiPart行中读取文件中的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)

但没有。谁能告诉我应该怎么做?

2 个答案:

答案 0 :(得分: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部分,但是,希望它会起作用。

答案 1 :(得分:0)

Multipart / form-data遵循多部分MIME数据流的规则,请参阅w3.org。这意味着请求的每个部分都在流中形成一个部分。确定支持已经简单的字段(字符串),文件和流,但不支持对象序列化到一个部分。在邮件列表上询问后,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”会改变。一旦实施,我们将看到。