Почему мои аннотации Джексона не распознаются в среде OSGi + JAX-RS (CXF rsServer)?

Используемые технологии:

  • Караф
  • Чертеж (реализация Овна)
  • CXF-RS (rsServer rsClient)
  • Верблюд
  • Джексон

Проблема: все мои аннотации Джексона игнорируются. Это приводит к тому, что все методы выполняются в каждом классе, который сериализуется.

При работе с OSGi в Java кажется, что есть три места, где объявления вступают в игру относительно зависимостей:

  • Зависимости объявлены для компилятора (для maven pom.xml)
  • Зависимости объявлены для пакета OSGi (в MANIFEST.MF. Для maven это можно сгенерировать с помощью Import-Package и Export-Package и Require-Bundle, но не знаю, как узнать их имена)
  • Зависимости объявлены для операции контейнера OSGI (для Karaf, features.xml). Они должны соответствовать файлу MANIFEST.MF.

Вероятно, я где-то ошибся и два класса читают JSON-аннотации. Любые идеи?

Соответствующий фрагмент pom.xml

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-extension-providers</artifactId>
            <version>3.2.1</version>
        </dependency>

        <!-- Adds Jackson JSON Provider to JAX-RS -->
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.9.8</version>
        </dependency>

Соответствующий фрагмент functions.xml

 <feature version="${jackson.version}">jackson-core</feature>
 <feature version="${jackson.version}">jackson-annotations</feature>

импорт OSGi

<Import-Package>
  org.apache.cxf.*,

  <!--org.apache.camel.component.blueprint,-->
  org.apache.camel,
  org.apache.camel.component.cxf,
  <!--org.apache.camel.component.jackson,-->
  org.apache.camel.component.http4,
  <!--org.apache.camel.jaxb,-->
  <!--org.apache.camel.component.jsch,-->
  javax.ws.rs;version="0";resolution:=optional,
  javax.xml.bind.*, 
  com.fasterxml.jackson.jaxrs.json;resolution:=optional,
  com.fasterxml.jackson.jaxrs.annotation,
  com.fasterxml.jackson.jaxrs.base,
</Import-Package>

(rs) Реализация сервера в Blueprint

<!-- JAXRS providers -->
<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
<!--<bean id="xmlProvider" class="com.fasterxml.jackson.jaxrs.xml.JacksonJaxbXMLProvider"/>-->
<!--<bean id="jaxbjsonProvider" class="com.fasterxml.jackson.jaxrs.xml.JacksonJaxbJsonProvider" />-->

<!-- CXF Core Bus conveniently called "jaxrs" so that we can bind the jsonProvider to it for all traffic -->
<cxfcore:bus id="jaxrs" bus="jaxrs">
    <!--<cxfcore:properties>
        <entry key="skip.default.json.provider.registration" value="true"/>
    </cxfcore:properties>-->
</cxfcore:bus>

<!-- CXF REST Server using rsServer element -->
<cxf:rsServer id="cxfConsumer" address="/mcs-connect" serviceClass="at.ac.uibk.mcsconnect.api.IMcsService" loggingFeatureEnabled="true" bus="jaxrs">
    <cxf:providers>
        <ref component-id="jsonProvider"/>
        <!--<ref component-id="xmlProvider"/>-->
        <!--<ref component-id="jaxbjsonProvider"/>-->
   </cxf:providers>
</cxf:rsServer>

person Jonathan Komar    schedule 03.04.2019    source источник


Ответы (1)


Я не вижу соответствующий код/схему, которая фактически публикует сервер, но для использования CXF+Jackson я обычно импортирую пакет org.apache.cxf.jaxrs.provider.* и помещаю следующую конфигурацию в файл схемы:

<jaxrs:server id="your.server.name" address="/template">
    <jaxrs:serviceBeans>
        <ref component-id="your.server.impl" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref component-id="jsonProvider" />
    </jaxrs:providers>
</jaxrs:server>

<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
person matteo rulli    schedule 03.04.2019
comment
Я добавил код, который создает сервер во время выполнения. - person Jonathan Komar; 05.04.2019