gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:22:09 26 4
gpt4 key购买 nike

我目前正在开发一些 RESTful API 的版本 2,为了保持与版本 1 的兼容性,我想将该版本作为媒体类型参数添加到所有请求/响应中。

版本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 时没有考虑媒体类型的参数。如果我将所有媒体类型更改为例如@Produces("application/something"),调用 MyProvider,并根据指定的 DateFormat 对 Vehicle 对象中的日期进行序列化。

我的问题是:如何更改默认 JacksonJsonProvider 的贪婪行为,以便考虑媒体类型的参数?

谢谢

最佳答案

更改/升级 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)

关于java - 为什么 JacksonJsonProvider 会忽略 MediaType 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com