Объединение конечных точек с различными поставщиками 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, это нормально и полезная информация.

0 ответов

Другие вопросы по тегам