JAX-RS与CXF /休息保证的:处理multiparam文件上传(JAX-RS with CXF

2019-09-16 15:15发布

我想上传一个JPG文件和JSON序列化的Java对象。 在服务器上,我使用Apache CXF,在客户端上我与集成测试休息,放心 。

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

@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)

但不是。 谁能告诉我应该如何?

Answer 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部分,但是,希望它会工作。



Answer 2:

多部分/格式数据如下多部分MIME数据流的规则,参见w3.org 。 这意味着请求的每个部分形成所述流中的一部分。 已经休息保证的支持简单的字段(字符串),文件和流,而不是对象序列化到一个组成部分。 要求在邮件列表后,约翰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”将改变。 我们会看到,一旦它被实现。



文章来源: JAX-RS with CXF / rest-assured: Handling multiparam file upload