Modifié par Administrateur local le 2019/06/03 16:50

Afficher les derniers auteurs
1 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.
2 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//.
3
4 La distribution d'un jeu d'Apis REST vers une configuration spécifique peut se faire de 2 façons.
5
6 **__A. Déclaration d'une servlet CXF spécifique à un jeu d'APIs (utilisation d'un fichier de configuration Spring //beans.xml// dédié).__**
7
8
9
10 {{code language="xml" theme="Eclipse" title="web.xml (extrait)" language="xml"}}
11 <servlet>
12 <servlet-name>CXFServlet1</servlet-name>
13 <display-name>CXF Servlet1</display-name>
14 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
15 <init-param>
16 <param-name>config-location</param-name>
17 <param-value>/WEB-INF/beans1.xml</param-value>
18 </init-param>
19 </servlet>
20 <servlet>
21 <servlet-name>CXFServlet2</servlet-name>
22 <display-name>CXF Servlet2</display-name>
23 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
24 <init-param>
25 <param-name>config-location</param-name>
26 <param-value>/WEB-INF/beans2.xml</param-value>
27 </init-param>
28 </servlet>
29 <servlet-mapping>
30 <servlet-name>CXFServlet1</servlet-name>
31 <url-pattern>/ws1/*</url-pattern>
32 </servlet-mapping>
33 <servlet-mapping>
34 <servlet-name>CXFServlet2</servlet-name>
35 <url-pattern>/ws2/*</url-pattern>
36 </servlet-mapping>
37 {{/code}}
38
39
40 La servlet CXFServlet1 utilise la configuration WEB-INF/beans1.xml et son servlet-mapping est /ws1/*
41 La servlet CXFServlet2 utilise la configuration WEB-INF/beans2.xml et son servlet-mapping est /ws2/*
42 La servlet CXFServletN utilise la configuration WEB-INF/beansN.xml et son servlet-mapping est /wsN/*
43
44
45
46 {{code language="xml" theme="Eclipse" title="beans1.xml" language="xml"}}
47 <context:component-scan base-package="com.hardis.adelia.webservice,hardis.fr" />
48
49 <jaxrs:server id="SRVRS1" address="/" transportId="http://cxf.apache.org/transports/http">
50 </jaxrs:server>
51 {{/code}}
52
53
54
55
56
57 {{code language="xml" theme="Eclipse" title="beans2.xml" language="xml"}}
58 <context:component-scan base-package="com.hardis.adelia.webservice,svlet2.fr" />
59 <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
60
61 <jaxrs:server id="SRVRS2" address="/" transportId="http://cxf.apache.org/transports/http">
62 </jaxrs:server>
63 {{/code}}
64
65
66
67 **Remarques** :
68 * 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.).
69 Pour scinder les services en n jeux distincts, il faut donc utiliser **n packages différents** (//hardis.fr// et //svlet2.fr// dans l'exemple).
70 * 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.
71 * 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//.
72 * Les n jeux d'APIs sont accessibles via un préfixe d'URL différent défini par le couple (<contextRoot>, <CXFServletMapping>) ~=> /contextRoot/ws1/... pour le 1er jeu, /contextRoot/ws2/... pour le second, etc.
73
74
75
76
77 **__B. Déclaration de N <jaxrs:server> dans un même fichier de configuration Spring //beans.xml//.
78 __**
79 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.
80 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.
81
82
83
84 {{code language="xml" theme="Eclipse" title="bean.xml (extrait)" language="xml"}}
85 <jaxrs:server id="Rest1" address="/jrs1" transportId="http://cxf.apache.org/transports/http">
86 <jaxrs:serviceBeans>
87 <bean class="hardis.fr.DJRS1AdeliaService" />
88 </jaxrs:serviceBeans>
89 </jaxrs:server>
90
91 <jaxrs:server id="Rest2" address="/jrs2" transportId="http://cxf.apache.org/transports/http">
92 <jaxrs:serviceBeans>
93 <bean class="svlet2.fr.DJRS2AdeliaService" />
94 </jaxrs:serviceBeans>
95 <jaxrs:providers>
96 <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
97 </jaxrs:providers>
98 </jaxrs:server>
99 {{/code}}
100
101
102
103 **Remarques** :
104 * Ce mode ne permet plus d'utiliser le //context:component-scan// de Spring. Par conséquent il n'est plus nécessaire d'utiliser N packages différents mais il faut déclarer explicitement les programmes de services (Cf. //jaxrs:serviceBeans//), les providers (Cf. //jaxrs:providers//), les features (Cf. //jaxrs:features//) pour chaque //jaxrs:server//.
105 * Les N jeux d'APIs sont accessibles via un préfixe d'URL différent défini par le 3-uplet (<contextRoot>, <CFXServletMapping>, <address>), ~=> /contextRoot/CXFServletMapping/**jrs1**... pour le 1er jeu, /contextRoot/CXFServletMapping/**jrs2**/... pour le second, etc.
106 * L'élément <jaxrs:server> //Rest2// déclare un //provider// faisant référence à la classe //JacksonJaxbJsonProvider //ce qui force l'utilisation de la librairie jackson pour la sérialisation des messages dans le cas du endpoint /contextRoot/CXFServletMapping/**jrs2**.
107
108
109
110
111 **__SWAGGER__**
112
113 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) :
114
115
116 {{code language="xml" title="beans.xml" language="xml"}}
117 <bean id="swagger2Feature" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature" lazy-init="true">
118 <property name="resourcePackage" value="com.hardis.jaxrs1, com.hardis.jaxrs2"/>
119 <property name="supportSwaggerUi" value="true"/> <!-- à partir d'Adélia Studio 13 PTF09 -->
120 </bean>
121 {{/code}}
122
123
124
125 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.
126
127
128 {{code language="xml" theme="Eclipse" title="beans.xml (extrait)" language="xml"}}
129 <bean id="swagger2Feature" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature" lazy-init="true">
130 <property name="supportSwaggerUi" value="true"/> <!-- à partir d'Adélia Studio 13 PTF09 -->
131 <property name="usePathBasedConfig" value="true"/>
132 <property name="scan" value="false"/>
133 </bean>
134
135 <jaxrs:server id="Rest1" address="/jrs1" transportId="http://cxf.apache.org/transports/http">
136 <jaxrs:serviceBeans>
137 <bean class="hardis.fr.DJRS1AdeliaService" />
138 </jaxrs:serviceBeans>
139 <jaxrs:providers>
140 <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
141 </jaxrs:providers>
142 <jaxrs:features>
143 <ref bean="swagger2Feature" />
144 </jaxrs:features>
145 </jaxrs:server>
146
147 <jaxrs:server id="Rest2" address="/jrs2" transportId="http://cxf.apache.org/transports/http">
148 <jaxrs:serviceBeans>
149 <bean class="svlet2.fr.DJRS2AdeliaService" />
150 </jaxrs:serviceBeans>
151 <jaxrs:providers>
152 <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
153 </jaxrs:providers>
154 <jaxrs:features>
155 <ref bean="swagger2Feature" />
156 </jaxrs:features>
157 </jaxrs:server>
158 {{/code}}
159
160
161 **Remarques**
162 * 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 [[http://<domain>:<port>/<ContextRoot>/<CXFServletMapping>/api-docs?url=/<RootContext>/<CXFServletMapping>/swagger.json>>url:http://localhost:8080/domsvx/ws/api-docs?url=/domsvx/ws/swagger.json]]
163
164