如何解决使用@JsonTypeInfo

时间:2015-06-16 16:47:08

标签: java json jackson

我正在使用@JsonTypeInfo机制来实现发送到REST API的数据对象的多态性。 我遇到了我的类型属性添加两次的问题,这清楚地解释为this jackson issue(我没有把我的代码放在这里,因为该问题顶部的代码与我的相似)。根据这个问题,这是一个已知的问题,只能通过使用JsonTypeInfo.As.EXISTING_PROPERTY来解决。

不幸的是,我没有找到任何显示使用JsonTypeInfo.As.EXISTING_PROPERTY的简单用例的代码示例 - 我的意思是,我认为these Unit tests是jackson-databind项目的一部分,可以使用作为一个例子,但是当我用JsonTypeInfo.As.EXISTING_PROPERTY替换JsonTypeInfo.As.PROPERTY时,我从我的服务器获得状态代码为400的响应,具有以下响应主体:

“不知道如何为包含类型构建标准类型序列化程序:EXISTING_PROPERTY”。

我调试了它,我的所有业务逻辑都运行正常 - 直到将响应对象发送回客户端(我使用标准的javax.ws.rs.core.Response.ResponseBuilder来构建响应所有检索到的数据对象)

我尝试过使用另一种解决方案: Unexpected duplicate key error using @JsonTypeInfo property ,它假设解决了重复的密钥问题,仍然使用JsonTypeInfo.As.PROPERTY - 但它只是没有解决重复问题。

我的服务器是tomcat 8,服务器端的代码是用Java 8编写的,我使用Spring 4,Jersey 2.14用于REST,我已经配置了我的项目以使用最新的jackson-annotations版本从他们的git存储库(2.6.0-rc3-SNAPSHOT) - 因为在jackson票证中他们已经指定只有这个版本的JsonTypeInfo.As.EXISTING_PROPERTY才能正常工作。

1 个答案:

答案 0 :(得分:0)

调试这种方法的一种方法是首先看看你是否可以在单元测试中进行反序列化工作;类似于你看到的,使用2.6.0-rc3-SNAPSHOT,但你自己的类型。

假设工作(按照错误修复的预期),问题将是JAX-RS堆栈中的问题。有几种可能性:

  1. 包含的杰克逊版本不是2.6.0-rc3-SNAPSHOT。 Maven传递依赖项很棘手,因此您可能需要查看mvn tree:dependency以查看是否获得了jackson-databind的旧版本
  2. Jackson JAX-RS提供商有一个问题。我不知道会直接影响这种情况的问题,但如果您的根值是多态类型,那可能就是原因。
  3. 如果您可以看到哪个部分(核心数据绑定或JAX-RS)导致问题,我建议您在相应项目(jackson-databind或jackson-jaxrs-providers)中提交新的github问题。