【问题标题】:Why aren't my Jackson annotations being recognized in an OSGi + JAX-RS (CXF rsServer) environment?为什么在 OSGi + JAX-RS (CXF rsServer) 环境中无法识别我的 Jackson 注释?
【发布时间】:2019-04-03 20:38:43
【问题描述】:

使用的技术:

  • 卡拉夫
  • 蓝图(Aries 实现)
  • CXF-RS (rsServer rsClient)
  • 骆驼
  • 杰克逊

问题:我的所有 Jackson 注释都被忽略。这会导致在每个被序列化的类中执行所有方法。

当在 Java 中使用 OSGi 时,似乎有三个地方需要声明关于依赖关系:

  • 为编译器声明了依赖项(对于 maven,pom.xml)
  • 为 OSGi 包声明了依赖项(在 MANIFEST.MF 中。对于 maven,可以使用 Import-Package 和 Export-Package 和 Require-Bundle 生成,但不知道如何找出这些)
  • 为 OSGI 容器操作声明了依赖项(对于 Karaf,features.xml)。这些必须对应于 MANIFEST.MF。

我可能在某个地方犯了一个错误,两个类正在读取 JSON 注释。有什么见解吗?

相关pom.xml sn -p

        <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>

相关 features.xml sn-p

 <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)蓝图中的服务器实现

<!-- 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>

【问题讨论】:

    标签: jackson jax-rs karaf blueprint cxfrs


    【解决方案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"/>
    

    【讨论】:

    • 我添加了在运行时创建服务器的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多