У меня есть веб-приложение Java, которое реализует REST API с использованием Джерси и Джексона, и оно развернуто как образ Docker на основе официального образа Docker tomcat.
Некоторые классы используются в качестве параметров тела API и организованы в виде древовидной иерархии с полем типа String, действующим как дискриминатор типа, объявленным с аннотацией JsonTypeInfo .
У меня есть два развертывания одного и того же образа Docker на двух разных серверах, первый - сервер Ubuntu 16.04, а второй - Centos 7.6.
Теперь метод, использующий вышеупомянутые классы в качестве параметра body, успешно выполняется на сервере Ubuntu, тогда как на сервере Centos выдает следующее исключение, если переданный объект JSON имеет поле типа, отличное от первого:
java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonStreamContext. (Lcom / fastxml / jackson / core / JsonStreamContext;) V
в com.fasterxml.jackson.databind.util.TokenBufferReadContext. (TokenBufferReadContext.java:47)
Это полезная нагрузка, которая принимается с обоих серверов:
{
"type": "query",
"size": 10
...
}
в то время как этот отклонен с сервера Centos:
{
"size": 10
"type": "query",
...
}
Я проверил банки на двух изображениях, и они одинаковы с одинаковыми версиями. Упомянутый в исключении метод конструктора можно найти в jackson-core-2.9.3 jar Вокруг нет других версий библиотеки.
Все нормально, если параметр типа является первым в объекте JSON, но, к сожалению, это не может быть гарантировано, потому что API вызывается из приложения IOS, которое не дает никакого контроля над порядком полей в распределении объектов JSON.
Я не могу понять, как операционная система может влиять на выполнение контейнерного Java-приложения, есть ли у кого-нибудь какие-либо предложения о том, какое направление мне следует исследовать?
РЕДАКТИРОВАТЬ : проблема решена. Jar jackson-core-2.9.3 был включен как в папку lib Tomcat, так и в папку WEB-INF / lib веб-приложения; по какой-то неизвестной причине в экземпляре Centos это вызывает ошибку метода not found, я просто удалил файл из папки WEB-INF / lib и ошибка исчезла. Было бы интересно выяснить, может ли это быть ошибка Java.