使用Spring在Apache CXF中使用不同的JSON提供程序统一端点

Mic*_*ter 7 spring cxf jax-rs

背景

我们使用的是Apache CXF 2.5.x,JSR 311 1.1.1Spring 2.5.x.

我们目前有2个端点,ABC和DEF,它们使用Jackson作为JSON提供者.我们的Spring文件看起来像:

<bean id="jacksonMapper" class="org.codehaus.jackson.map.ObjectMapper" />
<bean id="jsonProvider"class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" p:mapper-ref="jacksonMapper"/>

<jaxrs:server id="service1" address="/">
    <jaxrs:serviceBeans>
        <ref bean="resourceABC" />
        <ref bean="resourceDEF" />
    </jaxrs:serviceBeans>
    <jaxrs:providers >
         <ref bean="jsonProvider"/>
    </jaxrs:providers>
</jaxrs:server>
Run Code Online (Sandbox Code Playgroud)

在Java类上使用注释,可以通过http://company.com/api/rest/ABC和使用这些端点http://company.com/api/rest/DEF

挑战

我们想要引入一个新的端点IJK,它使用Gson作为JSON提供者.我们希望端点映射到http://company.com/api/rest/IJK.

注意:实际上,http://company.com/api/rest/new/IJK通过使用不同的端点来映射是非常容易的,但我们希望避免这种情况.

途径

我们尝试使用相同的地址定义新服务器:

<jaxrs:server id="service2" address="/">
    <jaxrs:serviceBeans>
        <ref bean="resourceIJK" />
    </jaxrs:serviceBeans>
    <jaxrs:providers >
         <ref bean="gsonProvider"/>
    </jaxrs:providers>
</jaxrs:server>
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我们尝试providers在同一个server元素中使用多个,但没有骰子.

此链接讨论使用serverFactories元素.如:

<beans>
  <jaxrs:server id="customerService" address="/service1">
    <jaxrs:serviceFactories>
      <ref bean="sfactory1" />
      <ref bean="sfactory2" />
    </jaxrs:serviceFactories>
  </jaxrs:server>

  <bean id="sfactory1" class="org.apache.cxf.jaxrs.spring.SpringResourceFactory">
     <property name="beanId" value="customerBean1"/>
  </bean>
  <bean id="sfactory2" class="org.apache.cxf.jaxrs.spring.SpringResourceFactory">
     <property name="beanId" value="customerBean2"/>
  </bean>

  <bean id="customerBean1" class="demo.jaxrs.server.CustomerRootResource1" scope="prototype"/>
  <bean id="customerBean2" class="demo.jaxrs.server.CustomerRootResource2"  scope="prototype"/>
</beans>
Run Code Online (Sandbox Code Playgroud)

这看起来很有希望,但如何设置JSON provider的服务,customerBean1customerBean2在春天?

有人可以用serviceFactories澄清上面的最后一种方法吗?我们能否实现与Gson而不是Jackson 引入resourceIJK(在同一端点根域)的目标?

如果它只能用Apache CXF 2.7完成,那就是好的和有用的信息.