我有一个Java Web应用程序,该应用程序使用Jersey和Jackson实现了REST API,并且已基于tomcat官方Docker映像部署为Docker映像。
有一些类用作API主体参数,并组织成具有层次结构的树层次结构,其中String类型字段用作类型区分符,并使用 JsonTypeInfo 注释声明。
我在两个不同的服务器上有两个相同Docker映像的部署,第一个是Ubuntu 16.04 Server,第二个是Centos 7.6。
现在,使用上述类作为body参数的方法可以在Ubuntu服务器上成功运行,而如果传递的JSON对象的类型字段不是第一个,则在Centos服务器上将引发以下异常:
java.lang.NoSuchMethodError:com.fasterxml.jackson.core.JsonStreamContext。(Lcom / fasterxml / jackson / core / JsonStreamContext;)V 在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,周围没有其他版本的库。
如果type参数是JSON对象中的第一个,则一切正常,但是遗憾的是,这不能保证,因为从IOS应用程序调用了API,该应用程序无法控制JSON对象编组中的字段顺序。
我无法弄清楚操作系统如何影响容器化Java应用程序的执行,是否有人对我应该调查哪个方向提出建议?
编辑:问题已解决。 jackson-core-2.9.3 jar包含在Web应用程序的Tomcat lib文件夹和WEB-INF / lib文件夹中;由于Centos实例中的某些未知原因,这导致方法未找到错误,我只是从WEB-INF / lib文件夹中删除了文件,错误消失了。研究它是否可能是Java错误会很有趣。