Как использовать Джексона в качестве провайдера JSON для JAX-RS-Client вместо Johnzon в TomEE 7?

Я использую TomEE 7.0.1 с Jackson 2 в качестве провайдера JAX-RS JSON (настроен в openejb-jar.xml). Публикация json в службах jax-rs работает отлично и использует аннотации jackson.

Но при использовании клиента JAX-RS (или веб-клиента cxf) всегда используется Johnzon, даже если я предоставляю Джексону метод Webclient.create. После некоторой отладки я уверен, что TomEE каким-то образом добавляет Johnzon в клиентскую фабрику, и никакой другой парсер тела сообщения для json использовать нельзя.

Это ошибка интеграции TomEE CXF или я что-то упустил?


person Christian Kalkhoff    schedule 11.08.2016    source источник
comment
как ты добавил джексона? client.register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);   -  person ulab    schedule 12.08.2016


Ответы (1)


Johnzon по умолчанию зарегистрирован на шине, чтобы иметь поставщика JSON (сопоставление) и JSON-P по умолчанию. CXF достаточно умен, чтобы сделать поставщиков шин с более низким приоритетом, чем у приложений (register() для клиентского API), поэтому, если вы вызываете register, вы ожидаете использовать jackson... и все еще использовать johnzon - я подозреваю, что это тот случай, когда вы попали.

Это совершенно нормально и связано с двумя вещами:

  1. Определение приоритета спецификации JAX-RS
  2. Джексон потребляет/производит определение

Подводя итог (1), говорится, что более конкретный провайдер имеет более высокий приоритет, поэтому провайдер «application/json» будет иметь преимущество в пользу «/».

Чтобы избежать проблем, Джонзон использует «application/json». Однако Джексон использует собственную стратегию сопоставления и поэтому использует "/". Таким образом, приоритет шины игнорируется, поскольку приоритета медиатипа достаточно, чтобы сказать, что johnzon «более адаптирован», чем jackson для json.

Чтобы решить эту проблему, проще всего переопределить провайдера jackson (просто расширить его) и украсить его @Provides/@Consumes с MediaType.APPLICATION_JSON вместо подстановочного знака.

person Romain Manni-Bucau    schedule 12.08.2016
comment
Переопределение Джексона и сужение выбора типа носителя отлично работает! Спасибо! - person Christian Kalkhoff; 12.08.2016
comment
Я просто не могу отблагодарить вас в достаточной степени, вы спасли меня от множества разочарований после долгих часов отладки всего исходного кода! - person N00b Pr0grammer; 27.02.2018
comment
Привет, ребята, я тоже борюсь с этой проблемой, но я застрял на более ранней стадии: я включил jackson-databind и jackson-jaxrs-json-provider, и при запуске я получаю сообщение об ошибке java.lang.ClassNotFoundException: javax. ws.rs.ext.MessageBodyReader. Любые идеи, в чем причина этого? Я использую TomEE 7.0.5. Спасибо. - person Serban; 03.06.2019