为什么JacksonJsonProvider会忽略MediaType的参数?

时间:2013-09-14 18:58:02

标签: java json jboss jackson resteasy

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

由于

1 个答案:

答案 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)