我目前正在使用某些RESTful API的Version2并保持与Version1的兼容性我想将版本作为媒体类型参数添加到所有请求/响应中。
版本1:接受:application / json,application / json; application& version = 1.0
版本2:接受:application / json; application& version = 2.0
在版本1中,所有时间戳都被序列化为自1970年以来的ms时间,然而,版本2将使用ISO-8601。
我的想法是为媒体类型应用程序扩展JacksonJsonProvider / json; application& version = 2.0:
@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的贪婪行为,以便考虑媒体类型的参数?
由于
答案 0 :(得分: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)