Как использовать Джексона 2 в Payara 5?

Я использую Jackson 2 с Payara 4 и хотел бы использовать Jackson 2 с Payara 5.

Используя JAX-RS, я также хотел бы избежать изменения аннотаций и т.д....

В Payara 5 поставщиком Jsonb по умолчанию является Yasson. Есть идеи отключить его и вместо этого использовать Джексона? Все комментарии/идеи приветствуются :-)

Примечание: Yasson очень интересен, но обработка сериализации/десериализации абстрактного класса или интерфейса немного сложнее, чем добавление аннотации Джексона. Мое текущее понимание состоит в том, что для этого требуется реализовать JsonbSerializer/Deserializer, но на самом деле сериализатор/десериализатор доступен только для поля/метода (проблема открыта для класса, что будет очень полезно). В любом случае, переход на Yasson будет означать реализацию многих сериализаторов/десериализаторов по мере необходимости (для сущностей и, конечно, коллекций), но я думаю, что это сложно.


person Julien Sié    schedule 12.04.2018    source источник
comment
Как вы используете Jackson 2 с Payara 4? Если вы включите Jackson 2 в Payara 5, он должен автоматически отключить поставщика Jsonb по умолчанию. См. этот ответ: stackoverflow.com/a/18318314/784594   -  person OndroMih    schedule 14.04.2018
comment
Ну, я только что добавил зависимости Джексона 2.8.9 в свой pom.xml и отключил поставщика moxyJson по умолчанию в моем web.xml.   -  person Julien Sié    schedule 20.04.2018
comment
Что вы получите, если сделаете то же самое с Payara 5? Я думаю, что добавление Джексона автоматически отключает поставщика JSON-B.   -  person OndroMih    schedule 20.04.2018
comment
Ничего. Он использует JSON-B (Yasson), и я не могу найти способ его обойти.   -  person Julien Sié    schedule 22.04.2018
comment
Это ожидаемое поведение или есть улучшение?   -  person Julien Sié    schedule 02.05.2018
comment
Глядя на исходный код, Джерси не зарегистрирует другую функцию, если она уже зарегистрирована. Я думал, что функция, предоставляемая вашим приложением, будет иметь приоритет, но это не так. Moxy предоставляет специальное свойство для его отключения, но функция JsonB этого не делает. Тем не менее, можно отдать предпочтение определенной функции, установив свойство jersey.config.jsonFeature для конкретной функции, которая для Джексона равна JacksonFeature. добавлю развернутый ответ   -  person OndroMih    schedule 03.05.2018


Ответы (2)


Вам нужно установить для свойства jersey.config.jsonFeature значение JacksonFeature, чтобы функция JsonB по умолчанию не регистрировалась.

Вы можете установить его либо в коде, переопределив метод Application.getProperties(), либо установить свойство в web.xml как context-param:

<context-param>
  <param-name>jersey.config.jsonFeature</param-name>
  <param-value>JacksonFeature</param-value>
</context-param>

Если ваш сервлет Джерси явно объявлен в web.xml (либо как javax.ws.rs.core.Application, либо как пользовательский подкласс), вместо этого используйте init-param в объявлении сервлета приложения Джерси:

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <init-param>
        <param-name>jersey.config.jsonFeature</param-name>
        <param-value>JacksonFeature</param-value>
    </init-param>
    ...
</servlet>

Вам также необходимо добавить зависимости Джексона в ваше приложение, но вы, вероятно, уже сделали это, поэтому игнорируйте это.

Объяснение:

Функция MOXy предоставляет свойство jersey.config.disableMoxyJson для ее отключения. Функция JsonB по умолчанию в Payara 5 не предоставляет такое свойство, но не будет регистрироваться, если свойство jersey.config.jsonFeature существует и не является JsonBindingFeature. Одно и то же свойство работает для всех функций Джерси, поэтому установка для него значения JacksonFeature позволит зарегистрировать только функцию JacksonFeature.

person OndroMih    schedule 03.05.2018
comment
Привет Ондржей. Означает ли это, что мне также нужно добавить зависимости org.glassfish.jersey? JacksonFeature не находится в com.fasterxml.jackson.jaxrs или в любом другом провайдере jackson, который у вас может быть. У вас есть пример web.xml? - person Julien Sié; 28.06.2018
comment
Что ж, вы будете рады узнать, что это работает... но я удивлен. Я не добавлял упомянутые зависимости, и это работает. Ниже вы найдете выдержку из моего web.xml - person Julien Sié; 28.06.2018
comment
Не понимаю почему, но org.glassfish.jersey.jackson.JacksonFeature не импортируется и работает. Означает ли это, что синтаксический анализатор просто проанализирует свойство... без проверки наличия файла/класса? Удивительный и странный лайфхак ;) - person Julien Sié; 28.06.2018
comment
Это была такая боль, что я переопределил getClasses и потерял автоматическое обнаружение. Где кто-то находит эти конфигурации? Я был на всем сайте payar - person nerdlyist; 29.06.2018
comment
Вам не нужно устанавливать параметр jersey.config.server.provider.packages. Этот параметр переопределяет метод getClasses и механизм автообнаружения. Кроме того, вместо jersey.config.server.provider.classnames init-param можно использовать jersey.config.jsonFeature context-param — см. пример в моем обновленном ответе. - person OndroMih; 02.07.2018
comment
Поскольку ваше приложение использовало Jackson на Payara 4, оно уже содержит все необходимые зависимости Jackson, включая org.glassfish.jersey.jackson.JacksonFeature — проверьте папку WEB-INF/classes вашего приложения в файле WAR. - person OndroMih; 02.07.2018
comment
Привет @OndrejM, я, наконец, только что переопределил метод getProperties и удалил свой грязный файл web.xml, и он работает. Большое спасибо за вашу поддержку и ваше объяснение ;) - person Julien Sié; 15.10.2018
comment
Привет, @JulienSié, я рад, что твое приложение наконец-то заработало! Теперь вы можете отметить этот ответ как правильный ответ ;-) - person OndroMih; 16.10.2018

Если ваш сервлет Джерси явно объявлен в web.xml (либо как javax.ws.rs.core.Application, либо как пользовательский подкласс), вместо этого используйте init-param в объявлении сервлета приложения Джерси:

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <init-param>
        <param-name>jersey.config.jsonFeature</param-name>
        <param-value>JacksonFeature</param-value>
    </init-param>
...
</servlet>
person Tobias    schedule 22.01.2020