Fehlerbehebung bei Vorgängen zur Schlüsselwertzuordnung

Sie sehen sich die Dokumentation zu Apigee Edge an.
Sehen Sie sich die Apigee X-Dokumentation an.
info

UnsupportedOperationException

Fehlercode

java.lang.UnsupportedOperationException

Fehlerantworttext

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

Ursache

Dieser Fehler tritt auf, wenn in der Richtlinie für Schlüsselwertzuordnungen das Attribut mapIdentifier auf einen leeren String festgelegt ist.

Diagnose

  1. Untersuchen Sie alle Schlüsselwertzuordnungen-Richtlinien im jeweiligen API-Proxy, in dem der Fehler aufgetreten ist. Wenn es eine Richtlinie für Schlüsselwertzuordnungen gibt, in denen das Attribut mapIdentifier als leerer String festgelegt wurde, ist dies die Ursache des Fehlers.

    Beispiel: Die folgende Richtlinie für Schlüsselwertzuordnungsvorgänge enthält einen leeren mapIdentifier:

    <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>
    

Lösung

Das Attribut mapIdentifier muss in der Richtlinie für Schlüsselwertzuordnungsvorgänge auf eine gültige Schlüsselwertzuordnung gesetzt sein.

Um die oben gezeigte Beispielrichtlinie zu korrigieren, können Sie den mapIdentifier auf eine vorhandene Schlüsselwertzuordnung UserLocationMap setzen.

<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

Fehlercode

steps.keyvaluemapoperations.SetVariableFailed

Fehlerantworttext

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

Beispiel für Fehlermeldung

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

Ursache

Dieser Fehler tritt auf, wenn Sie versuchen, einen Wert aus einer verschlüsselten Schlüssel/Wert-Zuordnung abzurufen und den Wert auf eine Variable festzulegen, deren Name nicht das Präfix private. hat. Das Präfix, das für grundlegende Sicherheitszwecke während der Fehlerbehebung erforderlich ist, blendet die verschlüsselten Werte aus API-Proxy-Trace- und Debug-Sitzungen aus.

Diagnose

1. Ermitteln Sie die Richtlinie für die Schlüsselwertzuordnungsvorgänge, in der der Fehler aufgetreten ist, sowie den Namen der Variablen, für die der Wert nicht festgelegt werden kann. Sie finden beide Elemente im Element faultstring der Fehlerantwort. Beispiel: Im folgenden faultstring lautet der Richtlinienname EncryptedKVM und die Variable myvar:

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

1. Überprüfen Sie in der XML-Datei der fehlgeschlagenen Richtlinie für die Schlüsselwertzuordnungsvorgänge den Namen der Variable, die im Attribut assignTo des Elements <Get> angegeben ist. Dieser muss mit dem im Fehlerstring (aus Schritt 1 oben) identifizierten Variablennamen übereinstimmen. Die folgende Richtlinie für Schlüsselwertzuordnungsvorgänge gibt beispielsweise eine Variable namens myvar im Element <Get> an, was mit dem Inhalt des faultstring übereinstimmt:

  <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. Prüfen Sie, ob die im Attribut mapIdentifier angegebene Schlüsselwertzuordnung eine verschlüsselte KVM ist. Wenn die KVM auf Umgebungsebene verschlüsselt ist, können Sie dies in der Edge-Benutzeroberfläche prüfen. Andernfalls, wenn sie auf Organisations- oder API-Proxy-Ebene erstellt wurde, müssen Sie mit der Management API prüfen, ob sie verschlüsselt ist. Weitere Informationen finden Sie unter KVMs verwalten und verwenden.

    So prüfen Sie, ob eine KVM auf Umgebungsebene in der Edge-Benutzeroberfläche verschlüsselt ist:

    1. Klicken Sie in der Edge-Benutzeroberfläche im linken Navigationsmenü auf Verwaltung.
    2. Klicken Sie auf Umgebungen.
    3. Klicken Sie auf Schlüsselwertzuordnungen.
    4. Suchen Sie die gewünschte Schlüsselwertzuordnung.
    5. Klicken Sie auf den Pfeil links neben dem Namen, um die Liste der Werte zu maximieren.
    6. Verschlüsselte Schlüsselwertzuordnungen zeigen Werte an, die in der UI durch Sternchen (*****) gekennzeichnet sind, wie unter Informationen zu verschlüsselten KVMs gezeigt.

    Mit den Management APIs können Sie prüfen, ob eine KVM auf Organisations-, Umgebungs- oder API-Proxy-Ebene verschlüsselt ist. Wenn Sie die API verwenden, sieht eine Beispielantwort, die sowohl die verschlüsselte Einstellung als auch Sternchen für den Wert enthält, so aus:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. Wenn die Schlüsselwertzuordnung eine verschlüsselte KVM ist und der im Attribut assignTo des <Get>-Elements verwendete Variablenname nicht das Präfix private hat. Dann ist das die Ursache des Fehlers.

    In der oben gezeigten Beispielrichtlinie für die Schlüsselwertzuordnung ist die Schlüsselwertzuordnung testEncrypted verschlüsselt und der Variablenname myvar hat nicht das Präfix private. Daher erhalten Sie den Fehlercode:

    steps.keyvaluemapoperations.SetVariableFailed
    

Lösung

Achten Sie darauf, dass der Variablenname im Attribut assignTo des Elements <Get> in der Richtlinie der Schlüsselwertzuordnungsvorgänge das Präfix private. hat, wenn die verwendete Schlüsselwertzuordnung verschlüsselt ist.

Um die oben gezeigte Beispielrichtlinie für Schlüsselwertzuordnungsvorgänge zu korrigieren, können Sie den Wert des Attributs assignTo in private.myvar ändern:

<?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>