4

リクエスト エンティティとして JAXB オブジェクトを受け入れる JAX-RS Web サービス (jersey を使用) があります。エラーが発生した場合、送信された元の xml 文字列をログに記録します。現在、私は JAXB オブジェクトを再マーシャリングしていますが、これらのクラスにはいくつかの Java 列挙型があるため、元の xml 文字列で正しく綴られていない列挙型の値が失われ、これは私たちの目的には受け入れられません。

リクエストエンティティを文字列と JABX オブジェクトの両方として取得する方法を知っている人はいますか? カスタム MessageBodyReader を作成したくないし、可能であれば JAXB の MessageBodyReader を取得しようとしないことを好みます。ジャージ固有のクラスも自由に使用できます。バージョン 1.0.x を使用しています。

4

2 に答える 2

2

JAX-RSAPIを使用してこれを行うのはそれほど難しくありません。これが私がしたことです:

@Path("/transactions")
public class TestResource<X> {

    private Class<X> jaxbClass;

    @POST
    @Path("/{transaction-id}")
    @Consumes("application/xml")
    public Response processPost(@Context Providers providers, @Context HttpHeaders httpHeaders, @PathParam("transaction-id") final long transactionId,
            final String xmlString) throws WebApplicationException, IOException {

        MessageBodyReader<X> reader = providers.getMessageBodyReader(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE);
        InputStream entityStream = new ByteArrayInputStream(xmlString.getBytes());
        final X xmlObject = reader.readFrom(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE, httpHeaders.getRequestHeaders(), entityStream);

        //insert logic here

        return Response.ok().build();
    }
}

これにより、わずか数行のコードでxmlが文字列およびJAXBオブジェクトとして提供されます。

于 2009-12-04T18:22:43.470 に答える
0

アイデアとして、Web アプリケーションにサーブレット フィルタを追加して、すべてのリクエストをインターセプトし、必要に応じて後で抽出できるスレッド コンテキストにペイロードをキャプチャすることができます。

于 2009-12-03T01:52:56.850 に答える