Aller au contenu
Kitegra
← Retour au blog

Module de cet article: Integration Flow Helper

Détecter les headers et propriétés inconnus dans SAP CPI avant qu'ils n'échouent en silence

Pourquoi un header ou une exchange property mal orthographié ou absent échoue sans erreur dans SAP CPI, les causes habituelles, et comment les détecter en conception et à l'exécution.

Détecter les headers et propriétés inconnus dans SAP CPI avant qu'ils n'échouent en silence

Un header jamais défini n'arrête pas un iFlow SAP CPI. L'expression qui le lit renvoie une valeur vide, une condition de Router devient fausse, un champ du payload reste vide, et le message poursuit son chemin. L'erreur, s'il y en a une, apparaît plusieurs étapes plus loin ou dans le système destinataire.

Cet article explique pourquoi les headers et exchange properties manquants échouent en silence, quelles causes reviennent sans cesse, et quelles vérifications les détectent avant qu'un message n'en fasse les frais.

Pourquoi un nom manquant ne lève pas d'erreur

Apache Camel traite un header ou une propriété absent comme vide, pas comme une erreur. C'est pratique pour les valeurs facultatives, et c'est la raison pour laquelle une faute de frappe peut vivre des mois dans un iFlow. Ce que vous observez dépend de l'endroit où le nom est lu :

  • Une valeur de Content Modifier comme ${property.orderId} devient une chaîne vide.
  • Une condition de Router ou de Filter comme ${header.orderType} = 'EXPRESS' vaut false : le message prend une autre route, souvent celle par défaut.
  • Une adresse de récepteur comme /orders/${property.orderId} appelle /orders/, et le système destinataire répond par une erreur qui ne mentionne pas la propriété manquante.
  • Dans un script Groovy, message.getHeader("orderId", String) renvoie null, et le script échoue plus tard sur une NullPointerException, ou écrit le texte null dans le payload.

Les causes habituelles

  • Une faute de frappe ou une mauvaise casse dans un nom de propriété : les noms d'exchange properties sont sensibles à la casse, donc orderID et orderId sont deux propriétés différentes. Les noms de headers ne le sont pas.
  • Un espace parasite, par exemple ${header.orderId } : le nom avec l'espace est un autre nom.
  • Une valeur définie sur une seule route d'un Router et lue après la jonction des routes.
  • Un header envoyé par l'appelant mais non admis : un émetteur HTTPS ne transmet que les headers personnalisés listés dans Allowed Header(s), sous la Runtime Configuration de l'iFlow.
  • Une propriété attendue d'un autre iFlow : les exchange properties ne traversent pas un appel ProcessDirect, seuls les headers le font (voir l'article sur ProcessDirect et JMS).
  • Une ligne de header qui lit une propriété créée dans le même Content Modifier, lequel traite la table des headers avant celle des propriétés.

Faire échouer bruyamment une valeur manquante

Pour les valeurs sans lesquelles le flux ne peut pas fonctionner, faites-le échouer là où elles sont nécessaires, et non trois étapes plus loin. Une courte étape Groovy au début du flux suffit :

import com.sap.gateway.ip.core.customdev.util.Message

def Message processData(Message message) {
    def orderId = message.getProperty("orderId")
    if (orderId == null || orderId.toString().trim().isEmpty()) {
        throw new IllegalStateException("Exchange property orderId is not set")
    }
    return message
}

Le message se termine alors en erreur, avec une phrase qui nomme la propriété manquante, visible dans le message processing log. Pour les conditions de Router, donnez à la route par défaut un rôle clair : terminez-la par un événement Error End lorsqu'aucune route ne doit jamais être manquée, au lieu de laisser le message continuer sur un chemin prévu comme solution de repli.

Pendant vos tests, réglez le niveau de log de l'iFlow sur Trace. La trace montre les headers et exchange properties à chaque étape : vous voyez exactement où une valeur disparaît.

Une checklist avant de déployer

  1. Listez chaque header et chaque propriété que l'iFlow lit : dans les expressions, les conditions, les champs d'adaptateur et les scripts.
  2. Pour chacun, trouvez l'étape qui le définit, sur chaque chemin qui mène à l'endroit où il est lu.
  3. Comparez l'orthographe à l'identique, y compris la casse pour les propriétés et les éventuels espaces.
  4. Pour les headers venant de l'émetteur, vérifiez qu'ils figurent dans Allowed Header(s).
  5. Pour les valeurs transmises par un autre iFlow, vérifiez qu'elles voyagent comme headers et non comme propriétés.

À la main, cela prend du temps sur un gros iFlow ; c'est pourquoi c'est la première vérification qui mérite d'être automatisée.

Des conventions de nommage qui évitent le problème

  • Choisissez un style, par exemple camelCase, et appliquez-le à chaque header et propriété du package.
  • Définissez les valeurs dont dépend tout le flux dans un seul Content Modifier, près du début, pour n'avoir qu'un endroit où regarder.
  • Laissez les préfixes SAP_ et Camel à SAP et à Apache Camel ; donnez une autre forme à vos propres noms.
  • Utilisez des propriétés pour les valeurs dont seul cet iFlow a besoin, et des headers uniquement pour celles qui doivent en sortir.

L'article sur les expressions Camel Simple explique la syntaxe derrière chaque nom de cette liste.

Ce qu'apporte Kitegra

L'extension de navigateur Kitegra applique cette checklist dans le designer de SAP Integration Suite. Son panneau de lint signale, avant le déploiement, les headers et propriétés que rien dans l'iFlow ne définit, un ${ non fermé et les espaces en trop dans les expressions.

Quand vous tapez ${ ou $, elle ne suggère que des noms définis par l'iFlow, y compris ceux définis dans les scripts Groovy et JavaScript, ainsi que les headers standard de SAP et de Camel : une faute de frappe devient donc moins probable dès le départ. Un nom défini sur certains chemins seulement est signalé par « Défini sur certains chemins seulement ». L'extension n'enregistre, ne déploie et ne modifie jamais le contenu d'un iFlow, et votre tenant ne change que lorsque vous cliquez sur l'une de quatre actions nommées, qui peuvent être désactivées.

Quand une valeur est vide à l'exécution, tracer le message étape par étape montre les headers et les propriétés avant chaque étape, et la checklist de revue d'iFlow couvre les erreurs de conception qui en sont la cause.

Sans compte Kitegra, elle fonctionne sur 5 iFlows par module. Le forfait Free en couvre 50, Starter 100 et Pro 300 ; Business n'a pas de limite. Comparez les forfaits.

Essayez-le dans votre prochain iFlow

Découvrez ce que fait Kitegra dans le designer de SAP Integration Suite, ou voyez-le aux côtés des autres extensions Chrome de Kitegra.

Questions fréquentes

Pourquoi SAP CPI ne lève-t-il pas d'erreur quand un header manque ?

Apache Camel renvoie une valeur vide pour un header ou une propriété qui n'existe pas. Le problème n'apparaît que là où cette valeur vide cause des dégâts, souvent plusieurs étapes plus loin.

Pourquoi mon exchange property est-elle null alors que je vois qu'elle est définie ?

Vérifiez la casse : les noms d'exchange properties y sont sensibles. Vérifiez aussi que l'étape qui la définit s'exécute sur le chemin emprunté par le message, et que la valeur n'était pas attendue à travers un appel ProcessDirect.

Pourquoi un header envoyé par l'appelant n'arrive-t-il pas dans mon iFlow ?

Un émetteur HTTPS ne transmet que les headers personnalisés listés dans Allowed Header(s), dans la Runtime Configuration de l'iFlow. Ajoutez-y le nom du header.

Comment voir les headers et propriétés à chaque étape ?

Réglez le niveau de log de l'iFlow sur Trace et faites passer un message. La trace, dans le moniteur, montre les headers et exchange properties de chaque étape.

Comment arrêter le flux quand une valeur obligatoire manque ?

Ajoutez une étape de script qui vérifie la valeur et lève une exception avec un message clair, ou dirigez la branche par défaut d'un Router vers un événement Error End.

Peut-on le vérifier avant le déploiement ?

Oui, en comparant chaque nom que l'iFlow lit avec les noms qu'il définit. Le panneau de lint de Kitegra le fait dans le designer.

Travaillez sur vos iFlows sans quitter le designer

Ajoutez Kitegra à Chrome ou Microsoft Edge. Commencez gratuitement, sans compte.