1

私は現在、いくつかの RESTful API の Version2 に取り組んでおり、Version1 との互換性を維持するために、すべての要求/応答にメディア タイプ パラメータとしてバージョンを追加したいと考えていました。

Version1: Accept: application/json, application/json;application&version=1.0

Version2: Accept: application/json;application&version=2.0

バージョン 1 では、1970 年以降、すべてのタイムスタンプがミリ秒単位でシリアル化されていましたが、バージョン 2 では ISO-8601 が使用されます。

私のアイデアは、メディア タイプ application/json;application&version=2.0 の JacksonJsonProvider を拡張することでした。

@Provider
@Produces("application/json;application&version=2.0")
public class MyProvider extends JacksonJsonProvider {
    public MyProvider() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        mapper.setDateFormat(sdf);
        setMapper(mapper);
    }
    @Override
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        // TODO Auto-generated method stub
        System.err.println("\n\n*** MyProvider#isWriteable: mediaType:" + mediaType.toString() + "\n with parameters: " + mediaType.getParameters());
        return true;
    }

}

およびテスト リソース:

@Path("/test")
public class TestResource {
    @GET
    @Produces("application/json;application&version=2.0")
    public Response test( @Context HttpServletRequest request ) {
        Vehicle v = new Vehicle();
        return Response.ok(v).build();
    }
}

問題は、デフォルトの JacksonJsonProvider がメディア タイプのパラメーターを考慮せずに使用されることです。たとえば、すべてのメディア タイプを に変更する@Produces("application/something")と、MyProvider が呼び出され、指定された DateFormat に従って Vehicle オブジェクト内の日付がシリアル化されます。

私の質問は、メディア タイプのパラメーターが考慮されるように、デフォルトの JacksonJsonProvider の貪欲な動作を変更するにはどうすればよいですか?

ありがとう

4

1 に答える 1

0

ReSTful API を変更/アップグレードする一般的な方法は、新しい実装用に新しいエンドポイントを作成することです。

つまり、持っている場合

@Path("/rest/api/issue")

同じエンドポイントの別の実装を追加したい場合は、パスに新しい部分を追加します

@Path("/rest/api/{version}/issue")

{version} は、選択した API のバージョンです。

Atlassian の JIRA API は次のように処理します: https://developer.atlassian.com/static/rest/jira/5.0.html

また、メディア タイプに組み込みの定数を使用するのも良い方法です。

 @GET
 @Path("/rest/api/2/issue")
 @Produces(MediaType.APPLICATION_JSON)
于 2013-09-18T17:28:22.163 に答える