Les services REST Adélia s'appuient d'une part sur le framework CXF pour leur implémentation (jaxrs 2.0) et d'autre part sur le framework Spring pour leur configuration.
Il est - sous certaines conditions - possible d'avoir une configuration différente pour 2 (ou n) jeux de services/d'APIs REST : le 1er jeu peut par exemple utiliser une sérialisation jettison et le second jeu une sérialisation jackson.

La distribution d'un jeu d'Apis REST vers une configuration spécifique peut se faire de 2 façons.

A. Déclaration d'une servlet CXF spécifique à un jeu d'APIs (utilisation d'un fichier de configuration Spring beans.xml dédié).


<servlet> 
    <servlet-name>CXFServlet1</servlet-name> 
    <display-name>CXF Servlet1</display-name> 
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
    <init-param> 
      <param-name>config-location</param-name> 
      <param-value>/WEB-INF/beans1.xml</param-value> 
    </init-param> 
  </servlet> 
  <servlet> 
    <servlet-name>CXFServlet2</servlet-name> 
    <display-name>CXF Servlet2</display-name> 
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
    <init-param> 
      <param-name>config-location</param-name> 
      <param-value>/WEB-INF/beans2.xml</param-value> 
    </init-param> 
  </servlet>     
  <servlet-mapping> 
    <servlet-name>CXFServlet1</servlet-name> 
    <url-pattern>/ws1/*</url-pattern> 
  </servlet-mapping> 
  <servlet-mapping> 
    <servlet-name>CXFServlet2</servlet-name> 
    <url-pattern>/ws2/*</url-pattern> 
  </servlet-mapping> 

La servlet CXFServlet1 utilise la configuration WEB-INF/beans1.xml et son servlet-mapping est /ws1/*
La servlet CXFServlet2 utilise la configuration WEB-INF/beans2.xml et son servlet-mapping est /ws2/*
La servlet CXFServletN utilise la configuration WEB-INF/beansN.xml et son servlet-mapping est /wsN/*

 

<context:component-scan base-package="com.hardis.adelia.webservice,hardis.fr" /> 

<jaxrs:server id="SRVRS1" address="/" transportId="http://cxf.apache.org/transports/http">         
</jaxrs:server> 

 

 

<context:component-scan base-package="com.hardis.adelia.webservice,svlet2.fr" />
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>

<jaxrs:server id="SRVRS2" address="/" transportId="http://cxf.apache.org/transports/http">     
</jaxrs:server> 

 

Remarques :



B. Déclaration de N <jaxrs:server> dans un même fichier de configuration Spring beans.xml.

Il est possible de conserver une seule servlet CXF et un unique fichier de configuration beans.xml. En revanche il n'est alors plus possible d'utiliser le context:component-scan de Spring.
La distribution des différents jeux d'APIs vers des endpoints distincts, des configurations spécifiques, se fait à l'aide de l'élément <jaxrs:server> avec l'attribution d'une address et des propriétés propres.

<jaxrs:server id="Rest1" address="/jrs1" transportId="http://cxf.apache.org/transports/http">         
  <jaxrs:serviceBeans> 
     <bean class="hardis.fr.DJRS1AdeliaService" /> 
  </jaxrs:serviceBeans> 
</jaxrs:server>   

<jaxrs:server id="Rest2" address="/jrs2" transportId="http://cxf.apache.org/transports/http">             
   <jaxrs:serviceBeans> 
      <bean class="svlet2.fr.DJRS2AdeliaService" /> 
   </jaxrs:serviceBeans> 
   <jaxrs:providers>             
      <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />     
   </jaxrs:providers> 
</jaxrs:server>  


Remarques :



SWAGGER

La feature Swagger2Feature de CXF permet dans le cas d'utilisation du context:component-scan de filtrer les Apis à présenter sur un ensemble de packages (dans l'exemple : com.hardis.jaxrs1 et com.hardis.jaxrs2) :

<bean id="swagger2Feature" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature" lazy-init="true">                               
   <property name="resourcePackage" value="com.hardis.jaxrs1, com.hardis.jaxrs2"/>
   <property name="supportSwaggerUi" value="true"/> <!-- à partir d'Adélia Studio 13 PTF09 -->
</bean>


Dans le cas de la déclaration de plusieurs jaxrs:server, il faut spécifier à swagger de créer un contexte spécifique au endpoint.

 <bean id="swagger2Feature" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature" lazy-init="true">                           
      <property name="supportSwaggerUi" value="true"/> <!-- à partir d'Adélia Studio 13 PTF09 -->
      <property name="usePathBasedConfig" value="true"/>           
      <property name="scan" value="false"/>             
 </bean> 

<jaxrs:server id="Rest1" address="/jrs1" transportId="http://cxf.apache.org/transports/http">         
  <jaxrs:serviceBeans> 
     <bean class="hardis.fr.DJRS1AdeliaService" /> 
  </jaxrs:serviceBeans>
  <jaxrs:providers>             
      <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />     
  </jaxrs:providers>
  <jaxrs:features>
      <ref bean="swagger2Feature" />
  </jaxrs:features>
</jaxrs:server>   

<jaxrs:server id="Rest2" address="/jrs2" transportId="http://cxf.apache.org/transports/http">             
   <jaxrs:serviceBeans> 
      <bean class="svlet2.fr.DJRS2AdeliaService" /> 
   </jaxrs:serviceBeans> 
   <jaxrs:providers>             
      <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />     
   </jaxrs:providers>
   <jaxrs:features>
      <ref bean="swagger2Feature" />
   </jaxrs:features>
</jaxrs:server>  

Remarques