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

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

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам