Dépannage des erreurs d'exécution des opérations de mappage de clés-valeurs

Vous consultez la documentation d'Apigee Edge.
Accédez à la documentation sur Apigee X.
info

UnsupportedOperationException

Code d'erreur

java.lang.UnsupportedOperationException

Corps de la réponse d'erreur

{
   "fault":{
      "faultstring":"java.lang.UnsupportedOperationException",
      "detail":{
         "errorcode":"Internal Server Error"
      }
   }
}

Cause

Cette erreur se produit si l'attribut mapIdentifier est défini sur une chaîne vide dans la règle des opérations de mappage de clés-valeurs.

Diagnostic

  1. Examinez toutes les règles d'opérations de mappage de clés-valeurs dans le proxy d'API spécifique où l'échec a eu lieu. S'il existe une règle d'opérations de mappage de clés-valeurs dans laquelle l'attribut mapIdentifier est défini comme une chaîne vide, il s'agit de la cause de l'erreur.

    Par exemple, la règle d'opérations de mappage de clés-valeurs suivante est associée à un élément mapIdentifier vide :

    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreKvm" mapIdentifier="">
        <DisplayName>StoreKvm</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
        <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
        <Put override="true">
            <Key>
                <Parameter ref="request.queryparam.key"/>
            </Key>
            <Value ref="request.queryparam.value"/>
        </Put>
        <Scope>apiproxy</Scope>
    </KeyValueMapOperations>
    

Solution

Assurez-vous que l'attribut mapIdentifier est défini sur un mappage de clés-valeurs valide dans la règle des opérations de mappage de clés-valeurs.

Pour corriger l'exemple de règle présenté ci-dessus, vous pouvez spécifier mapIdentifier à un mappage de clés-valeurs existant UserLocationMap.

<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreKvm" mapIdentifier="UserLocationMap">
    <DisplayName>StoreKvm</DisplayName>
    <Properties/>
    <ExclusiveCache>false</ExclusiveCache>
    <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
    <Put override="true">
        <Key>
            <Parameter ref="request.queryparam.key"/>
        </Key>
        <Value ref="request.queryparam.value"/>
    </Put>
    <Scope>apiproxy</Scope>
</KeyValueMapOperations>

SetVariableFailed

Code d'erreur

steps.keyvaluemapoperations.SetVariableFailed

Corps de la réponse d'erreur

{
   "fault":{
      "faultstring":"Failed to set variable variable_name in KeyValueMapStepDefinition policy_name",
      "detail":{
         "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
      }
   }
}

Exemple de message d'erreur

{
   "fault":{
      "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM",
      "detail":{
         "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
      }
   }
}

Cause

Cette erreur se produit si vous tentez de récupérer une valeur à partir d'un mappage de clés-valeurs chiffré et de la définir sur une variable dont le nom ne comporte pas le préfixe private.. Le préfixe, requis pour des raisons de sécurité élémentaires lors du débogage, masque les valeurs chiffrées des sessions de débogage et de suivi du proxy d'API.

Diagnostic

1. Identifiez la règle d'opérations de mappage de clés-valeurs où l'erreur s'est produite et le nom de la variable à laquelle la valeur ne peut pas être définie. Vous pouvez trouver ces deux éléments dans l'élément faultstring de la réponse d'erreur. Par exemple, dans le fichier faultstring suivant, le nom de la règle est EncryptedKVM et celui de la variable est myvar :

  "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM"

1. Dans la requête XML de la règle d'opérations de mappage de clés-valeurs ayant échoué, vérifiez que le nom de la variable spécifié dans l'attribut assignTo de l'élément <Get> correspond au nom de variable identifié dans la chaîne d'erreur (étape 1 ci-dessus). Par exemple, la règle suivante d'opérations de mappage de clés-valeurs spécifie une variable nommée myvar dans l'élément <Get>, qui correspond à ce qui se trouve dans le fichier faultstring :

  <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Key-Value-Map-Operations-1" mapIdentifier="testEncrypted">
      <DisplayName>KeyValueMapOperations-1</DisplayName>
      <Properties/>
      <ExclusiveCache>false</ExclusiveCache>
      <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
      <Get assignTo="myvar" index="1">
          <Key>
              <Parameter>foo</Parameter>
          </Key>
      </Get>
      <Scope>environment</Scope>
  </KeyValueMapOperations>
  1. Vérifiez si le mappage de clés-valeurs spécifié dans l'attribut mapIdentifier est une KVM chiffrée. Si la KVM est chiffrée au niveau de l'environnement, vous pouvez vérifier qu'elle est chiffrée dans l'interface utilisateur Edge. Sinon, s'il a été créé au niveau de l'organisation ou de l'apiproxy, vous devez utiliser l'API Management pour vérifier s'il est chiffré. Consultez également la section Gérer et utiliser des mappages clé-valeur.

    Pour vérifier si une KVM de portée environnement est chiffrée dans l'interface utilisateur Edge:

    1. Dans l'interface utilisateur Edge, cliquez sur Administration dans le menu de navigation de gauche.
    2. Cliquez sur Environnements.
    3. Cliquez sur Mappages de clés-valeurs.
    4. Recherchez le mappage de clés-valeurs que vous souhaitez utiliser.
    5. Cliquez sur la flèche située à gauche du nom pour développer la liste des valeurs.
    6. Les mappages de clés-valeurs chiffrés affichent des valeurs masquées avec des astérisques dans l'interface utilisateur (*****), comme indiqué dans la section À propos des KVM chiffrés.

    Pour vérifier si une KVM définie au niveau de l'organisation, de l'environnement ou du proxy d'API est chiffrée, utilisez les API de gestion. Si vous utilisez l'API, un exemple de réponse affichant à la fois le paramètre chiffré et les astérisques pour la valeur se présente comme suit:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. Si le mappage de clés-valeurs est une KVM chiffrée et que le nom de la variable utilisée dans l'attribut assignTo de l'élément <Get> n'a pas le préfixe private, alors il s'agit de la cause de l'erreur.

    Dans l'exemple de règle d'opérations de mappage de clés-valeurs ci-dessus, le mappage de clés-valeurs testEncrypted est chiffré et le nom de la variable myvar n'a pas le préfixe private. Par conséquent, vous recevez le code d'erreur :

    steps.keyvaluemapoperations.SetVariableFailed
    

Solution

Vérifiez que le nom de la variable comporte le préfixe private. dans l'attribut assignTo de l'élément <Get> de la règle d'opérations de mappage de clés-valeurs si le mappage clés-valeurs utilisé est chiffré.

Pour corriger l'exemple de règle d'opérations de mappage de clés-valeurs ci-dessus, vous pouvez remplacer la valeur de l'attribut assignTo par private.myvar :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Key-Value-Map-Operations-1" mapIdentifier="testEncrypted">
    <DisplayName>KeyValueMapOperations-1</DisplayName>
    <Properties/>
    <ExclusiveCache>false</ExclusiveCache>
    <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
    <Get assignTo="private.myvar" index="1">
        <Key>
            <Parameter>foo</Parameter>
        </Key>
    </Get>
    <Scope>environment</Scope>
</KeyValueMapOperations>