Противоречивость поставщика jackson-jaxrs в WildFly с развертыванием EAR - PullRequest
2 голосов
/ 30 января 2020

У нас есть приложение Java EE 7, работающее на WildFly 9, состоящее из развернутого развертывания EAR, которое содержит несколько файлов WAR, несколько JAR-файлов на уровне EAR и папку lib, содержащую 3-х парные JAR-файлы. (Я знаю, что это не так, как сегодня, но это так.) Одна из WAR содержит службу REST JAX-RS, которая ПОЛУЧАЕТ и POST-объект данных, который содержит Java 8 OffsetDateTime , Поскольку JSON -B еще не доступен, мы использовали @JsonSerialize / @JsonDeserialize form jackson-databind , чтобы маршалировать его от и до JSON.

Это работало достаточно хорошо до тех пор, пока из-за смены другой WAR зависимость jackson-jaxrs попала в папку lib на уровне EAR. Затем произошло то, что сортировка перестала работать, поскольку контейнер пытался установить строку даты из JSON непосредственно в тип OffsetDateTime и при получении записывать все внутренние поля даты Java 8 вместо форматированная строка. Я предположил, что обработка вышеупомянутых аннотаций не состоялась, и поэтому сервер попытался отобразить это как другие простые типы. Когда я удалил JAR-файлы, принадлежащие зависимости jackson-jaxrs , все снова заработало нормально. Сервер приложений затем, вероятно, использовал свою собственную версию этого самого JAR-файла из своей папки модулей.

Итак, мой вопрос: в чем разница при наличии JAR-файла jackson-jaxrs в EARs lib папка дополнительно к системе предоставлен модуль или только последний? Почему он не учитывает аннотации в первом случае при де / сериализации?

1 Ответ

2 голосов
/ 06 февраля 2020

Wildfly 9 связывает Jackson 1.9 в качестве базового модуля, а аннотации находятся в пакете org.codehaus.jackson. Я подозреваю, что недавно добавленная библиотека - это (более поздняя) версия Jackson 2.x, а аннотации теперь находятся в пакете com.fasterxml.jackson.

Если это так, то обновление до версии Jackson 2.x (в идеале той же версии, что и та, что вы получили из EAR) должно решить эту проблему.

В качестве альтернативы вы можете изолировать ваше подразделение от банки Джексона. Присутствующий в EAR может работать, но может быть запутан с переходными зависимостями. См. загрузка классов в Wildfly

EDIT , как вы подтвердили, запущены две разные версии. Если вы можете себе это позволить, согласование версий наиболее определенно поможет решить проблему.

Кроме того, вам может понадобиться изолировать каждое подразделение, чтобы оно могло видеть только ожидаемую версию. См., Например, этот ответ (который изолирует все развертывание от базового модуля).

...