我想上传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)
但没有。谁能告诉我应该怎么做?
答案 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”会改变。一旦实施,我们将看到。