Bonjour à tous,

Et oui, encore un billet technique, désolé à mes lecteurs non-geeks ;-)

Aujourd'hui, en effet, je me suis pris le chou avec CXF. J'espère que ça pourra être utile à d'autres ;-)

Le contexte : JAX-RS et CXF

À tort ou à raison, on utilise CXF comme implémentation JAX-RS. JAX-RS, c'est une spécification Java pour pouvoir faire du REST. CXF utilise Jettison comme sérialiseur JSON. Or, Jettison s'appuie sur JAXB[1], ce qui est bien pratique pour le développeur, mais tout pourri pour ce qui est du JSON produit[2].

Jackson : le sérialiseur JSON idéal

C'est là qu'intervient jackson. Je crois que c'est aujourd'hui le meilleur sérialiseur JSON pour Java. Et en plus, il y a plein de docs pour le faire fonctionner avec JAX-RS. Sauf qu'en fait, ça marche pas[3].

La solution avec Spring

Voici la solution trouvée, dans un fichier de contexte Spring :

<jaxrs:server id="monBeauServiceRest" address="/service">
  <jaxrs:serviceBeans>
    <ref bean="monBeanRest" />
  </jaxrs:serviceBeans>
  <jaxrs:providers>
    <ref bean="jsonProvider"/>
  </jaxrs:providers> 
</jaxrs:server>

<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider">
</bean>

Notes

[1] La spécification Java pour faire du XML facilement.

[2] Notamment, les tableaux/collections sont sérialisés différemment en fonction de leur contenu. Pratique.

[3] Ou alors ça marche peut-être en JAX-RS 1.1 implémenté par CXF 2.3 pas encore sorti. Ou avec Jersey.