3.37 Procédures-diverses

Ce chapitre contient des procédures et des aides pour des points particuliers nécessitant des explications.


3.37.1 - Comment ajouter le client d’API d’un micro-service dans un autre micro-service ?

En tout premier lieu, il faut ajouter la dépendance du client d’appel dans le micro-service appelant. Donc éditer le fichier $projetAppelant/pom.xml :

<!-- Le classifier CLIENT du projet xxxxxxx pour la compilation/exécution normale -->
<dependency>
	<groupId>com.github.talbotgui.psl.socle</groupId>
	<artifactId>socle-xxxxxxx</artifactId>
	<version>${project.version}</version>
	<classifier>client</classifier>
	<exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions>
</dependency>
<!-- Pour faire fonctionner les tests dans Eclipse qui gère mal le classifier "client" (cf. chapitre 3.37.1 de la documentation) -->
<dependency>
	<groupId>com.github.talbotgui.psl.socle</groupId>
	<artifactId>socle-xxxxxxx</artifactId>
	<version>${project.version}</version>
	<scope>test</scope>
	<exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions>
</dependency>

Pour rendre disponible le client Feign dans l’application appelante, il faut :

//pour activer les clients Feign et appeler un service exposé d'un autre micro-service via une simple interface
//Le basePackage permet de générer automatiquement un client pour les interfaces de @Controler d'un package
@EnableFeignClients(basePackages = { "com.github.talbotgui.psl.socle.xxxxxxxxxxxxxxx.apiclient.api" })

Pour disposer du client d’appel dans la classe de service, il suffit d’ajouter :

/** Client d'appel de l'API des xxxxxxxx */
@Autowired
private XxxxxxxAPI clientXxxxxxx;

Dans le test du service, il est nécessaire d’ajouter un bouchon du client d’appel à l’API appelée.

  • Si ce n’est pas déjà fait, ajouter, sur la classe XxxServiceTest, la configuration nécessaire à Mockito :
//Activation de Mockito dans ce test qui ne génére qu'une unique instance de la classe de test pour l'ensemble des méthodes de la classe
@TestInstance(Lifecycle.PER_CLASS)
@ExtendWith(MockitoExtension.class)
  • Déclarer le nouveau bouchon :
/** Bouchon du client d'appel à l'API Xxxxx présent dans le service. */
@Mock()
private xxxxxxxxxClient clientXxxxxxxxxxx;
  • Si ce n’est pas déjà fait, ajouter l’annotation @InjectMocks sur l’intance de service présente dans la classe de test.
  • Réinitialiser le nouveau bouchon entre chaque test, dans la méthode annotée @Before :
// Gestion des bouchons
Mockito.reset(this.clientXxxxxxxxxxx);

Dans les tests unitaires, sont maintenant présents plusieurs contextes Feign (les APIs de l’appelant et de l’appelé). Spring n’aime pas ça. Pour le contenter exclusivement dans les tests, il faut ajouter dans le fichier $projetAppelant/src/test/resources/application-testspecifique.properties les lignes suivantes :

# Configuration permettant le fonctionnement du test BrouillonAPITest car deux contextes Feign sont d�marr�s (et donc deux Bean du m�me nom).
spring.main.allow-bean-definition-overriding=true

3.37.2 - Ajout d’une dépendance dans le framework du workspace FRONT

Toute dépendance du framework FRONT doit être déclarée dans peerDependencies du package.json (comprendre j’en ai besoin) ainsi que dans le package.json à la racine (comprendre la voici).


3.37.3 - Cypress démarré avec xx-e2e ne trouve pas l’application qui est pourtant démarré

Il arrive que, dans l’application Cypress démarrée avec la commande npm run cypress, s’affiche le message “http://xxxx non trouvé”. Ceci vient souvent du proxy. Ce dernier est sans doute mal paramétré. Si l’application est démarrée en local sur un poste de développement, il est nécessaire d’exécuter les commandes suivantes : export HTTP_PROXY= et export HTTPS_PROXY=.


3.37.4 - Jackson n’arrive pas à transformer un JSON en Record (classcastexception LinkedHashMap)

Un record est un type de structure récent dans Java. Il ne dispose pas de SETTER. Donc Jackson ne peut travailler qu’avec les constructeurs. Pour cela, il faut lui fournir :

  • un constructeur complet
  • qui ne soit pas le constructeur par défaut du record (la convention du projet est : déplacer le premier paramètre en dernière position)
  • avec l’annotation @JsonCreator sur le constructeur
  • avec l’annotation @JsonProperty(“cases”) sur chacun des paramètres

Exemple :

/**
 * Constructeur contenant tous les attributs mais avec le premier en dernier pour fournit à Jackson un constructeur à utitiliser (les setter
 * n'existe pas dans un record). De plus, pour Jackson, il faut ajouter un @JsonCreator sur le constructeur et un @JsonProperty sur chaque
 * paramètre.
 */
@JsonCreator
public HubeeFolderDto(@JsonProperty("externalId") String externalId, @JsonProperty("applicant") HubeeApplicantDto applicant,
		@JsonProperty("cases") List<HubeeCaseDto> cases, @JsonProperty("attachments") List<HubeeAttachmentDto> attachments,
		@JsonProperty("createDateTime") Date createDateTime, @JsonProperty("updateDateTime") Date updateDateTime,
		@JsonProperty("closeDateTime") Date closeDateTime, @JsonProperty("id") String id, @JsonProperty("globalStatus") String globalStatus,
		@JsonProperty("processCode") String processCode) {
	this(processCode, externalId, applicant, cases, attachments, createDateTime, updateDateTime, closeDateTime, id, globalStatus);
}

3.37.5 - Erreur de compilation dans Eclipse

De temps en temps, Eclipse redéfini la configuration d’un ou plusieurs projets qui, du coup, ne sont plus cohérents avec la configuration du workspace ou du pom.xml.

La principale cause est la configuration du compilateur. Pour rechercher puis corriger ces erreurs :

  • rechercher org.eclipse.jdt.core.compiler.source dans les fichiers org.eclipse.jdt.core.prefs générés par Eclipse dans les répertoires .settings
  • remplacer le contenu de ces fichiers par
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning

3.37.6 - Comment chiffrer/déchiffrer le fichier variablesPourScripts.properties.gpg

Le fichier variablesPourScripts.properties.gpg est une version chiffrée du fichier variablesPourScripts.properties. Ce dernier était utilisé pour contenir les variables d’environnement utilisées par les différents scripts SH du socle. Mais, parmis elles, se trouvaient des mots de passe. Pour éviter que ces derniers soient trop facilement accessibles, en plus du bon chmod, le plus simple est de chiffrer le document. Pour cela, la commande gpg est utilisée :

  • La commande gpg -c variablesPourScripts.properties avec la passphrase nouvelleAnnee2023 a permis le chiffrement du fichier.
  • La commande gpg -dq variablesPourScripts.properties.gpg permet le déchiffrement.

Associée à la commande eval "$(...)" permettant d’exécuter la sortie standard d’une commande, on obtient l’exécution du fichier de properties et la définition des variables.


3.37.7 - Le micro-service SOCLE-REFERENTIEL ne démarre plus

Ce micro-service ne démarre pas si un référentiel ne s’initialise pas à cause d’une erreur 401 sur un appel HTTP.

Il est possible que des données en cache soit le problème dans le cas où :

  • un access token d’API soit en cache (et donc vieux et périmé)
  • les données associées ne soient pas en cache

Alors le service tente de télécharger les données avec un vieux token. Il faut retirer les données de token présentes dans le cache.


3.37.8 - Débugger un micro-service démarré en ligne de commande

/!\ En cas de problème entre l’exécution du code dans Eclipse et celle du code compilé, regarder à Proguard !! /!\

/!\ Pour analyser rapidement un problème, il est possible de debugger, non le code offusqué, mais le code des librairies. Un point d’arrêt sur exception est une bonne solution.

Les micro-services démarrés en ligne de commande ont un code offusqué. Ils n’est pas possible de faire du debug dans ces conditions.

En cas de problème non reproductible en démarrant le micro-service depuis Eclipse, il faut

  • commenter la ligne <excludeGroupIds>com.github.talbotgui.psl.socle</excludeGroupIds> du pom.xml du socle
  • commenter la balise proguard-maven-plugin des pom.xml du micro-service concerné
  • recompiler chaque projet mvn clean install -DskipTests -f ./socle-xxxx/
  • redémarrer le micro-service
  • redémarrer le remote debug

Après usage, annuler les modifications du pom.xml et recompiler le projet.