10

メディア タイプが に設定されている jaxrs サービスへのリクエストを実行しようとしていますmultipart/form-data。このリクエストには、エンティティのリスト (xml) と画像 (png、バイナリ) が含まれています。BalusC によるこのスレッドで説明されているように、私はリクエストを作成しました。

Wiresharkで検査した後、リクエストは問題ないように見えますが、IPヘッダーのチェックサムが間違っていることを除いて.

ここでの私の大きな問題は、サービス側でマルチパート リクエストを処理する方法です。apache.cxf、resteasy などのライブラリを含めたくありません。頼りたいのは jaxrs api だけです。

リクエストの 2 つの部分には と という名前が付いていますdeliveriessignature署名はバイナリとして送信された png 画像ファイルです。配信のリストはxmlから解析する必要があります(エンティティにはxmlrootelement注釈などが含まれているため、この部分は個別に機能します)。私はこの方法でさまざまな部分を読み込もうとしましたが、これは本当に大穴でした。

@PUT
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(@FormParam("deliveries") List<Delivery> deliveries, @FormParam("signature")File signature) {
    //do something with the signature(image) and the list of deliveries.
}

もちろん、これは機能しません。Websphere でリクエストを実行すると 404 http ステータス コードが返され、組み込みの openejb (統合テスト フレームワーク) に対してリクエストを実行すると 415 が返されます。注釈を削除するとFormParam、リクエストは成功します。

jaxrs API のみを使用して、マルチパート リクエストのさまざまな部分を読み取るにはどうすればよいですか?

編集 わかりましたので、 to を変更し、次のようPUTにparams に注釈をPOST追加しました。@Encoding

@POST
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(
    @Encoded @FormParam("deliveries") String deliveries,
    @Encoded @FormParam("signature") File signature) {

}

Content-Typexml をテキスト文字列として取得しましたが、ペイロードのこの部分の が に設定されていても、配信のリストに自動的に非整列化することはできませんapplication/xml。もう 1 つの問題は、受信したファイルの長さが 0 であり、そこからバイトを読み取れないことです。

ここで重要な点が欠けていますか?

4

3 に答える 3

8

実際、JAX-RS 仕様がこれのサポートを標準化していない理由を理解するのは難しいと思います (これに対処するためにhttps://java.net/jira/browse/JAX_RS_SPEC-413を作成しました)。

ただし、実装に依存しない方法でマルチパート フォームをサポートすることは可能です。MultiPart フォーム用に独自の MessageBodyReader を作成するか、MessageBodyReader に対応する MultiPartBody オブジェクトを提供する Apache Clerezza jaxrs.utils などのライブラリを使用します。このライブラリには実装仕様の依存関係がないため、アプリケーションは任意の jax-rs 実装で実行されます。

Clerezza jaxrs.utils の使用例については、http: //svn.apache.org/viewvc/stanbol/trunk/development/archetypes/stateless-webmodule/src/main/resources/archetype-resources/src の 105 行を参照してください。 /main/java/MultiEnhancer.java?revision=1465777&view=markup . OSGi を使用していない場合 (リソースのホワイトボード登録を使用)、アプリケーションに org.apache.clerezza.jaxrs.utils.form.MultiPartFormMessageBodyReader を追加する必要があります。

于 2013-06-06T08:46:38.423 に答える
-2

apache.cxf、resteasy などのライブラリを含めたくありません。頼りたいのはjaxrs apiだけです

API にはインターフェースしか含まれていないため、API に「依存」することはできません。そのインターフェースを実装するクラスは、RESTeasy、Jersey、または CXF から来ています。

そして、埋め込まれたopenejbに対してリクエストを実行すると415

415 は「サポートされていないメソッド」を意味します。これは、PUT を期待するリソースに GET リクエストを送信したときに発生します。

この場合、PUT の代わりに POST を使用することをお勧めします。あなたの特定のケースでは、 PUT@FormParamで​​の作業には適していないと思います。

于 2013-01-28T15:21:30.413 に答える