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

时间:2013-07-03 00:31:32

标签: spring cxf jax-rs

背景

我们正在使用Apache CXF 2.5.x,JSR 311 1.1.1Spring 2.5.x

我们目前有两个端点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>

在Java类上使用注释,这些端点可通过http://company.com/api/rest/ABChttp://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>

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

This link讨论了使用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>

这看起来很有希望,但如何为Spring中的服务providercustomerBean1设置JSON customerBean2

问题

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

如果只能使用Apache CXF 2.7来完成,那就是正常而有用的信息。

0 个答案:

没有答案