我目前正在研究一些 RESTful API 的 Version2 并保持与 Version1 的兼容性,我想将该版本作为媒体类型参数添加到所有请求/响应中。
版本 1:接受:application/json, application/json;application&version=1.0
版本2:接受: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 时没有考虑媒体类型的参数。如果我将所有媒体类型更改为 eg @Produces("application/something")
,则调用 MyProvider 并根据指定的 DateFormat 对 Vehicle 对象中的日期进行序列化。
我的问题是:如何更改默认 JacksonJsonProvider 的贪婪行为以便考虑媒体类型的参数?
谢谢