6

REST API のバージョン管理についてよく読んでいます。

そのため、HTTP-Accept-Header を使用して、クライアントが要求しているバージョンを示したいと思います。しかし、これをアプリケーションにどのように適用できますか? したがって、どのような変更が加えられましたか? マーシャラーは、どのバージョンを使用する必要があるかをどのように知るのでしょうか? 自分のタイプを登録する必要がありますか?

私が知っているのは、@Produces-Annotationの内容を変更する必要があるということです

@GET
@Path("/locations")
@Produces("application/vnd.mycompany-v1+xml")
Location[] getLocations();

しかし、他に何を変更する必要がありますか?

4

2 に答える 2

2

VariantJAX-RSのメカニズムを使用できます。

@GET
@Path("/locations/{id}")
@Produces(value = {"application/vnd.mycompany-v2+json", // current version
                   "application/vnd.mycompany-v1+json", // old version
                   MediaType.APPLICATION_JSON})         // fallback
public Response getLocation(@PathParam("id") Integer id,
                            @Context Request request) {
    MediaType vndTypeV1 = new MediaType("application", "vnd.mycompany-v1+json");
    MediaType vndTypeV2 = new MediaType("application", "vnd.mycompany-v2+json");
    Variant variant1 = new Variant(vndTypeV1, null, null);
    Variant variant2 = new Variant(vndTypeV2, null, null);
    Variant variantJson = new Variant(MediaType.APPLICATION_JSON_TYPE, null, null);
    List<Variant> variants = new ArrayList<Variant>();
    variants.add(variant1);
    variants.add(variant2);
    variants.add(variantJson);

    Variant selectedVariant = request.selectVariant(variants);

    Location location = someBackendService.getLocation(id);

    // Manipulate location according to which variant is the selectedVariant.
    // ...

    return Response.ok("{}")
        .header(HttpHeaders.CONTENT_TYPE, selectedVariant.getMediaType())
        .build();
}

Java EE 6 チュートリアルも参照してください。

編集

選択したバリアントに従ってエンティティを自動的にマーシャリングする方法はありません。これには手作業が必要です。例えば:

String version = extractVersionFromVariant(selectedVariant);
if ("v1".equals(version)) {
    location.setSomeV1Propery("only in v1);
} else if ("v2".equals(version)) {
    location.setSomeV2Propery("only in v2);
}
return Response.ok(location)
               .header(HttpHeaders.CONTENT_TYPE, selectVariant.getMediaType())
               .build();

バージョンが十分に異なる場合は、バージョンごとに JAXB アノテーション付きクラスを使用します。そのような各クラスには、このバージョンで有効なプロパティのみが含まれます。JAX-RS はそれらを JSON にマーシャリングします。

于 2012-10-25T08:34:22.993 に答える
1

私の知る限り、JAX-RS を使用して、http ヘッダーに基づいてさまざまなメソッドに自動的にルーティングすることはできません。

メソッド内のヘッダーを読み取り( @Context の @HeaderParam または HttpHeaders を使用して、こちらを参照、適切なバージョンを呼び出すことができます

于 2012-10-23T20:48:22.757 に答える