1

我目前正在研究一些 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 的贪婪行为以便考虑媒体类型的参数?

谢谢

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 回答