java - 如何解决使用@JsonTypeInfo时两次添加type属性的问题

标签 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 ,它假设可以解决重复 key 问题并仍然使用 JsonTypeInfo.As.PROPERTY - 但它只是没有解决重复问题。

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

最佳答案

调试此问题的一种方法是首先查看是否可以在单元测试中使反序列化工作;与您看到的类似,使用 2.6.0-rc3-SNAPSHOT,但您自己的类型。

假设有效(正如错误修复所预期的那样),问题是 JAX-RS 堆栈中的什么原因导致了问题。有两种可能性:

  1. 包含的 Jackson 版本不是 2.6.0-rc3-SNAPSHOT。 Maven 传递依赖关系很棘手,因此您可能需要查看 mvn tree:dependency 来查看您是否使用的是旧版本的 jackson-databind
  2. Jackson JAX-RS 提供商有问题。我不知道会直接影响这种情况的问题,但如果您的根值是多态类型,这可能就是原因。

如果您可以看到哪个部分(核心数据绑定(bind)或 JAX-RS)导致了问题,我建议您在相应项目(jackson-databind 或 jackson-jaxrs-providers)中提交一个新的 github 问题。

关于java - 如何解决使用@JsonTypeInfo时两次添加type属性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873564/

相关文章:

java - Eclipse IDE 调试 - 代码未反射(reflect)新更改

java - 如何执行动画listview滚动或限制滚动速度

java - Jackson:枚举实例方法以字符串形式返回值

java - 将多维数组从 Mongodb 映射到 Java 应用程序

java - Jackson 反序列化为默认子类型

java - 使用 SVN 将一些模板文本包含到源文件中的好解决方案?

java - 从字符串读取对象时出现 StreamCorruptedException

php - 如何将键附加到 json 的开头

Google Search Appliance 的 jQuery 自动完成 Json Ajax 跨浏览器问题

c# - WebApi POST 参数始终为空