java - 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 错误会很有趣。
解决方案
推荐阅读
- java - java - 如何在java中的一个语句actiolistener中放置2个条件?
- kotlin - 协程范围内的函数未取消
- linux - dnsmasq 的配置,允许将域“搜索”附加到 /etc/resolv.conf
- three.js - 我在使用three.js 碰撞检测时遇到问题
- rust - 根据类型别名使用导入的宏
- linux - Unix:按程序的返回值对“ls”进行排序
- testing - 如何检查 x86 汇编器 AT&T 代码是否正常?
- mysql - 3次尝试后MySQL超慢查询
- python - Python + Selenium - 如何检查使用 CSS 设置样式并显示为内容的图像?
- php - echo $array 与声明键?