1

私のリソースが次の方法で対処できると想像してください/rest/properties/<key>/data

サポートされるコンテンツ タイプは、プロパティ タイプによって異なります。

GET の場合、これは問題ありません: (ランタイム コンテンツ ネゴシエーション)

@GET 
public Response readData(@PathParam("key") String key) {
    MyProperty property = getProperty(key);
    List<Variant> variants = property.getType().getVariants();
    Variant variant = request.selectVariant(variants);
    if (null == variant) {
        return Response.notAcceptable(variants).build();
    }
    return Response.ok(property.getData(), variant).build();
    // -> registered @Provider (MessageBodyWriter) will be called
}

ここで、「Consumes」に相当するものを POST/PUT に使用したいと考えています。

最初に型を計算する必要があるため、いくつかのメソッドを定義する一般的なアプローチはオプションではありません。

したがって、目標は次のようなものです。

@POST
public Response updateData(@PathParam("key") String key, InputStream is) {
    MyProperty property = getProperty(key);
    List<Variant> variants = property.getType().getVariants();
    Variant variant = /* get request content type */;
    if (!variants.contains(variant)) {
        return Response.status(415).build();
    }
    entity = /* delayed MessageBodyReader call?!
        readFrom(is, variant , ExpectedClass.class);
     */

    ... save entity in db or fs

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

ところで、一般的なアプローチは次のとおりです。 [コンパイルされません(メディアタイプの競合を消費します)]

@POST
@Consumes("text/plain")
public Response updateDataPlain(@PathParam("key") String key, ExpectedClass entity) {
    ... save entity in db or fs

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

@POST
@Consumes("text/plain")
public Response updateDataPlain(@PathParam("key") String key, AnotherExpectedClassWhichSupportPlain entity);
4

1 に答える 1

0

私はあなたがすべきだと思います

@Consumes("*/*")

そして、Content-TypeHTTP ヘッダーを手動で処理します。

于 2013-01-07T17:55:37.677 に答える