2

JPGファイルとJSONシリアル化されたJavaオブジェクトをアップロードしたいと思います。サーバーではApacheCXFを使用しており、クライアントでは安心して統合テストを行っています。

私のサーバーコードは次のようになります:

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

しかし、違います。誰かがそれがどうあるべきか教えてもらえますか?

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を参照してください。これは、リクエストの各部分がストリームの一部を形成することを意味します。Rest-assuredは、すでに単純なフィールド(文字列)、ファイル、およびストリームをサポートしますが、パーツへのオブジェクトのシリアル化はサポートしません。メーリングリストで質問した後、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 に答える