私は現在、いくつかの 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 の貪欲な動作を変更するにはどうすればよいですか?
ありがとう