背景
我们正在使用Apache CXF 2.5.x,JSR 311 1.1.1和Spring 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/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>
但这不起作用。我们尝试在同一个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中的服务provider
和customerBean1
设置JSON customerBean2
?
问题
有人可以使用serviceFactories澄清上面的最后一种方法吗?我们能否实现在Gson而不是Jackson中引入resourceIJK
(在相同的端点根域)的目标?
如果只能使用Apache CXF 2.7来完成,那就是正常而有用的信息。