2

我想上传一个 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");

当我从文件中读取 json 部分时,一切正常,就像在第一个 multiPart 行中一样。但是,当我想序列化 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)

但不是。谁能告诉我应该怎么做?

4

2 回答 2

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 部分尝试过,但是,希望它会起作用。

于 2012-04-26T12:39:23.773 回答
0

Multipart/form-data 遵循多部分 MIME 数据流的规则,参见w3.org。这意味着请求的每个部分都构成流中的一部分。放心支持已经很简单的字段(字符串)、文件和流,但不支持将对象序列化为部分。在邮件列表上询问后,Johan Haleby(放心的作者)建议添加一个问题。该问题已被接受,请参阅问题 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”会改变。我们将看到它一旦实施。

于 2012-04-26T14:24:37.940 回答