Code source wiki de Services web REST - Externalisation de la configuration
Modifié par Administrateur local le 2022/08/05 12:01
Masquer les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| |
1.1 | 1 | La configuration des services web REST est assurée par défaut par le fichier //WEB-INF/beans.xml//. |
| 2 | Ce fichier de configuration //Spring// déclare des éléments **<bean>** paramétrables à l'aide de sous-éléments **<property>**. | ||
| 3 | La totalité ou une partie des valeurs des propriétés peuvent être regroupées dans un fichier afin d'être externalisées via une ressource JNDI. | ||
| 4 | |||
| 5 | Exemple de fichier //beans.xml// avec des propriétés dont les valeurs sont externalisées via une ressource JNDI nommée "java:comp/env/url/jettisonConf" | ||
| 6 | Pour externaliser une valeur, il faut affecter à l'attribut **value** la valeur : **"${identifiant}"** | ||
| 7 | |||
| 8 | |||
| 9 | {{code language="none"}} | ||
| 10 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 11 | <beans xmlns="http://www.springframework.org/schema/beans" | ||
| 12 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 13 | xmlns:jaxrs="http://cxf.apache.org/jaxrs" | ||
| 14 | xmlns:context="http://www.springframework.org/schema/context" | ||
| 15 | xmlns:cxf="http://cxf.apache.org/core" | ||
| 16 | xmlns:jee="http://www.springframework.org/schema/jee" | ||
| 17 | xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd | ||
| 18 | http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd | ||
| 19 | http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd | ||
| 20 | http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd | ||
| 21 | http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"> | ||
| 22 | |||
| 23 | <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" > | ||
| 24 | <property name="converters"> | ||
| 25 | <set> | ||
| 26 | <bean id="stringToMapConverter" class="com.hardis.common.StringToMapConverter" /> | ||
| 27 | </set> | ||
| 28 | </property> | ||
| 29 | </bean> | ||
| 30 | |||
| 31 | <jee:jndi-lookup id="jettisonConfProperties" jndi-name="java:comp/env/url/jettisonConf" resource-ref="true"/> | ||
| 32 | |||
| 33 | <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" depends-on="jettisonConfProperties"> | ||
| 34 | <property name="ignoreUnresolvablePlaceholders" value="true"/> | ||
| 35 | <property name="properties" ref="jettisonConfProperties"/> | ||
| 36 | </bean> | ||
| 37 | |||
| 38 | <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> | ||
| 39 | <property name="dropRootElement" value="${jettisonProvider.dropRootElement}"/> | ||
| 40 | <property name="serializeAsArray" value="${jettisonProvider.serializeAsArray}"/> | ||
| 41 | <property name="arrayKeys" value="${jettisonProvider.arrayKeys}"/> | ||
| 42 | <property name="supportUnwrapped" value="${jettisonProvider.supportUnwrapped}"/> | ||
| 43 | </bean> | ||
| 44 | </beans> | ||
| 45 | {{/code}} | ||
| 46 | |||
| 47 | |||
| 48 | Pour l'externalisation des propriétés, le fichier //beans.xml //ci-dessus déclare les éléments suivants : | ||
| 49 | * <**jee:jndi-lookup** id~="jettisonConfProperties" jndi-name~="**java:comp/env/url/jettisonConf**" resource-ref~="true"/> | ||
| 50 | Permet de désigner le nom de la ressource JNDI utilisée pour la recherche du fichier externalisé. | ||
| 51 | |||
| 52 | |||
| 53 | * <**bean** id~="propertyConfigurer" class~="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" depends-on~="jettisonConfProperties"> | ||
| 54 | <property name~="ignoreUnresolvablePlaceholders" value~="true"/> | ||
| 55 | <property name~="properties" ref~="jettisonConfProperties"/> | ||
| 56 | </bean> | ||
| 57 | Permet de déclarer un objet //PropertyPlaceholderConfigurer// s'appuyant sur le fichier externalisé des valeurs propriétés pour la substitution dans le fichier //beans.xml//. | ||
| 58 | |||
| 59 | |||
| 60 | * <**bean** id~="conversionService" class~="org.springframework.context.support.ConversionServiceFactoryBean" > | ||
| 61 | <property name~="converters"> | ||
| 62 | <set> | ||
| 63 | <bean id~="stringToMapConverter" class~="com.hardis.common.StringToMapConverter" /> | ||
| 64 | </set> | ||
| 65 | </property> | ||
| 66 | </bean> | ||
| 67 | Permet d'activer par défaut les convertisseurs nécessaires pour l'évaluation des valeurs des propriétés et déclare un convertisseur spécifique d'une //String// vers un objet //Map//. | ||
| 68 | |||
| 69 | Exemple (convertisseur //[String// → //List//], une chaîne composée de plusieurs chaînes séparées par une virgule est convertie en un objet //List//), : | ||
| 70 | ... | ||
| 71 | |||
| 72 | <property name~="arrayKeys" value~="**${jettisonProvider.arrayKeys}**"/> | ||
| 73 | ... | ||
| 74 | |||
| 75 | **jettisonProvider.arrayKeys**~=//implantations//, //products// | ||
| 76 | |||
| 77 | Equivaut à : | ||
| 78 | |||
| 79 | <property name~="**arrayKeys**"> | ||
| 80 | <list> | ||
| 81 | <value>//implantations//</value> | ||
| 82 | <value>//products//</value> | ||
| 83 | </list> | ||
| 84 | </property> | ||
| 85 | |||
| 86 | |||
| 87 | |||
| 88 | |||
| 89 | |||
| 90 | L'ensemble des couples (identifiant, valeur) sont regroupés dans un fichier .properties. | ||
| 91 | Exemple : jettisonConf.properties | ||
| 92 | |||
| 93 | |||
| 94 | {{code language="none"}} | ||
| 95 | jettisonProvider.dropRootElement=true | ||
| 96 | jettisonProvider.serializeAsArray=true | ||
| 97 | jettisonProvider.supportUnwrapped=true | ||
| 98 | jettisonProvider.arrayKeys=implantations, products | ||
| 99 | {{/code}} | ||
| 100 | |||
| 101 | |||
| 102 | |||
| 103 | Exemple d'une propriété avec pour valeur une //map// d'éléments : | ||
| 104 | **JWTADELIALOGINMODULE.adeliaParameters**~=[VAAuthProgram:com.hardis.adelia.HFAUWS][SSOEnabled:false][Unicode:true] | ||
| 105 | |||
| 106 | Equivaut à : | ||
| 107 | |||
| 108 | <property name~="**adeliaParameters**"> | ||
| 109 | <map> | ||
| 110 | <entry key~="VAAuthProgram" value~="com.hardis.adelia.HFAUWS" /> | ||
| 111 | <entry key~="SSOEnabled" value~="false" /> | ||
| 112 | <entry key~="Unicode" value~="true" /> | ||
| 113 | </map> | ||
| 114 | </property> | ||
| 115 | |||
| 116 | |||
| 117 | |||
| 118 | Déclaration de la ressource JNDI de façon globale ou propre au contexte de l'application web dans la configuration de Tomcat ($TOMCAT_HOME/conf/server.xml ou $TOMCAT_HOME/conf/Catalina/localhost/contextRoot.xml). | ||
| 119 | |||
| 120 | Exemple : Déclaration de la ressource JNDI propre au contexte de l'application nommée //mywebapp//. | ||
| 121 | Le nom de la ressource JNDI est : **url/jettisonConf** | ||
| 122 | L'emplacement du fichier externalisé des propriétés est : **c:/conf/jettisonConf.properties** | ||
| 123 | |||
| 124 | |||
| 125 | {{code language="none"}} | ||
| 126 | <Context path="/mywebapp" docBase="D:\webapps\mywebapp"> | ||
| 127 | <Resource auth="Container" factory="com.hardis.common.JndiURLPropsFactory" name="url/jettisonConf" type="java.net.URL" url="file:///c:/conf/jettisonConf.properties"/> | ||
| 128 | </Context> | ||
| 129 | {{/code}} | ||
| 130 | |||
| 131 | |||
| 132 | |||
| 133 | **Remarques** : | ||
| 134 | 1. Il est possible de scinder la configuration dans plusieurs fichiers properties afin d'assurer un découpage fonctionnel. | ||
| 135 | Par exemple, si une même application joue le rôle de serveur de jetons et de serveur de services, il est possible d'avoir un fichier de configuration propre à la production de jetons et un autre fichier de configuration propre à l'exposition des services. | ||
| 136 | Dans ce découpage, 2 ressources JNDI devront être créées, le fichier beans.xml devant alors déclarer 2 <jndi-lookup> et 2 <propertyConfigurer>. | ||
| 137 | |||
| 138 | |||
| 139 | 1. Lorsque les valeurs sont externalisées, il faut faire attention à :11. Remplacer les entités XML par leurs propres : //&// devient //&// | ||
| 140 | 11. Doubler les anti-slash : //hardis\domaine// devient //hardis\\domaine// | ||
| 141 | |||
| 142 | |||
| 143 | |||
| 144 | |||
| 145 |