首页 > 解决方案 > Jackson JSON对象反序列化中的异常

问题描述

我有一个使用 Jersey 和 Jackson 实现 REST API 的 Java Web 应用程序,它基于 tomcat 官方 Docker 映像部署为 Docker 映像。
有一些类用作 API 主体参数并组织为树层次结构,其中字符串类型字段充当类型鉴别器,使用JsonTypeInfo注释声明。
我在两个不同的服务器上部署了两个相同的 Docker 映像,第一个是 Ubuntu 16.04 服务器,第二个是 Centos 7.6。
现在,使用上述类作为 body 参数的方法在 Ubuntu 服务器上运行成功,而在 Centos 服务器上,如果传递的 JSON 对象的 type 字段不是第一个,则抛出以下异常:

java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonStreamContext.(Lcom/fasterxml/jackson/core/JsonStreamContext;)V at com.fasterxml.jackson.databind.util.TokenBufferReadContext.(TokenBufferReadContext.java:47)

这是从两个服务器接受的有效负载:

{
    "type": "query",
    "size": 10
    ...
}

而这个被 Centos 服务器拒绝:

{
    "size": 10
    "type": "query",
    ...
}

我检查了两个图像中的jar,它们完全相同,版本相同,异常中提到的构造方法可以在jackson-core-2.9.3 jar中找到,没有其他版本的库大约。
如果类型参数是 JSON 对象中的第一个参数,则一切正常,但不幸的是,这无法保证,因为 API 是从 IOS 应用程序调用的,该应用程序无法控制 JSON 对象编组中的字段顺序。我无法弄清楚操作系统如何影响容器化 Java 应用程序的执行,有人对我应该研究哪个方向有任何建议吗?

编辑:问题解决了。jackson-core-2.9.3 jar 包含在 Tomcat lib 文件夹和 Web 应用程序的 WEB-INF/lib 文件夹中;由于 Centos 实例中的某些未知原因,这会导致找不到方法错误,我只是从 WEB-INF/lib 文件夹中删除了该文件,错误就消失了。调查它是否可能是一个 Java 错误会很有趣。

标签: javajsonjacksonjersey

解决方案


推荐阅读