Объединение конечных точек с различными поставщиками JSON в Apache CXF с помощью Spring
Фон
Мы используем Apache CXF 2.5.x, JSR 311 1.1.1 и Spring 2.5.x
В настоящее время у нас есть 2 конечные точки, ABC и DEF, которые используют Джексона в качестве поставщика 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
элемент, но не игра в кости.
Эта ссылка обсуждает использование 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>
Это выглядит многообещающе, но как установить JSON provider
за услуги, customerBean1
а также customerBean2
весной?
Вопрос
Может кто-нибудь прояснить последний подход выше, с serviceFactories? Можем ли мы достичь цели внедрения resourceIJK
(в том же корне конечной точки) с Gson вместо Джексона?
Если это можно сделать только с Apache CXF 2.7, это нормально и полезная информация.