Vous regardez une version antérieure (v. /doccenter/pages/viewpage.action?pageId=215548609) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 8) afficher la version suivante »

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é).


web.xml (extrait)
<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/*

 

beans1.xml
<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> 

 

 

beans2.xml
<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 :

  • Ce mode permet d'utiliser le context:component-scan de Spring et permet ainsi d'enregistrer de façon automatique tous les services (sans avoir à les nommer) présents dans la liste de package base-package et tous les composants annexes (feature, provider, etc.).
    Pour scinder les services en n jeux distincts, il faut donc utiliser n packages différents (hardis.fr et svlet2.fr dans l'exemple).
  • Le fichier beans2.xml, en déclarant un bean faisant référence à la classe JacksonJaxbJsonProvider force CXF à utiliser la librairie jackson pour la sérialisation des messages.
  • Aujourd'hui la déclaration du fichier de configuration spring beans.xml est faite dans un web-fragment placé dans un .jar. Il faut par conséquent conserver (en plus des fichiers beans1, beans2...beansn) un fichier quasiment vide (<beans/>) nommé beans.xml.
  • Les n jeux d'APIs sont accessibles via un préfixe d'URL différent => /<contextRoot>/ws1/... pour le 1er jeu, /<contextRoot>/ws2/... pour le second, etc.




B. Déclaration de N "servers" jaxrs 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 une configuration spécifique se fait à l'aide de l'élément <jaxrs:server> avec l'attribution d'une address et des propriétés propres.

bean.xml (extrait)
<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 :

  • Ce mode ne permet plus d'utiliser le context:component-scan de Spring. Il faut par conséquent déclarer explicitement les programmes de services (Cf. jaxrs:serviceBeans), les providers (Cf. jaxrs.providers), les features...
    Pour scinder les APIs en N jeux distincts, il n'est alors plus nécessaire d'utiliser N packages différents (sauf pour une utilisation avec Swagger, voir plus bas).
  • Les N jeux d'APIs sont accessibles via un préfixe d'URL différent => /<contextRoot>/<servletMapping>/jrs1... pour le 1er jeu, /<contextRoot>/<servletMapping>/jrs2/... pour le second, etc.
  • L'élément <jaxrs:server> Rest2 déclare un provider faisant référence à la classe JacksonJaxbJsonProvider ce qui force CXF à utiliser la librairie jackson pour la sérialisation des messages



SWAGGER

Pour utiliser swagger, une classe étendant la feature Swagger2Feature de base a été ajoutée au runtime Adélia (PTF08 Fix01) ; la feature de base ne pouvant pas gérer 2 contextes différents.
Par exemple, dans le cas B, il faut alors déclarer la feature dédiée à swagger de la façon suivante :

beans.xml (extrait)
 <bean id="swf1" class="com.hardis.adelia.webservice.Swagger2FeatureExtended" lazy-init="true">                               
      <property name="basePath" value="/<contextRoot>/<SerlvetMapping>/jrs1"/>     
      <property name="resourcePackage" value="hardis.fr" />       
      <!--property name="supportSwaggerUi" value="true"/-->             
      <property name="usePathBasedConfig" value="true"/>     
      <property name="configId" value="/<contextRoot>/<SerlvetMapping>/jrs1/" />       
      <property name="scannerId" value="/<contextRoot>/<SerlvetMapping>/jrs1/"/>             
   </bean> 

 <bean id="swf2" class="com.hardis.adelia.webservice.Swagger2FeatureExtended" lazy-init="true">                               
      <property name="basePath" value="/<contextRoot>/<SerlvetMapping>/jrs2"/>     
      <property name="resourcePackage" value="svlet2.fr" />       
      <!--property name="supportSwaggerUi" value="true"/-->             
      <property name="usePathBasedConfig" value="true"/>     
      <property name="configId" value="/<contextRoot>/<SerlvetMapping>/jrs2/" />       
      <property name="scannerId" value="/<contextRoot>/<SerlvetMapping>/jrs2/"/>             
   </bean> 

<jaxrs:server id="Rest1" address="/jrs1" transportId="http://cxf.apache.org/transports/http">         
    <jaxrs:features> 
      <ref bean="swf1" />
    </jaxrs:features>  
... 
</jaxrs:server>
<jaxrs:server id="Rest2" address="/jrs2" transportId="http://cxf.apache.org/transports/http">         
    <jaxrs:features> 
      <ref bean="swf2" />
    </jaxrs:features>  
...</jaxrs:server>


Remarques :

  • La feature Swagger2FeatureExtended adresse les APIs regroupées dans un même package (ou un même groupe de packages). La séparation des APIs dans des packages distincts permet de lister séparément les APIs dans swagger.
  • La feature Swagger2FeatureExtended permet d'utiliser les propriétés nommées configId et scannerId nécessaires à la gestion de contextes spécifiques.
  • La propriété supportSwaggerUi (en commentaire dans l'exemple) est une propriété qui sera disponible dans Adélia Studio 13 PTF09 (version intégrant les dernières version de CXF et swaggerUi) permettant avec la seule présence de la librairie swagger-ui-3.x.y.jar d'avoir un accès à swaggerUi via l'URL









  • Aucune étiquette