Rozwiązywanie problemów z błędami podczas działania map klucz-wartość

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

UnsupportedOperationException

Kod błędu

java.lang.UnsupportedOperationException

Treść odpowiedzi o błędzie

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

Przyczyna

Ten błąd występuje, jeśli atrybut mapIdentifier w zasadzie operacji mapowania par klucz-wartość jest ustawiony na pusty ciąg znaków.

Diagnostyka

  1. Sprawdź wszystkie zasady operacji mapowania par klucz-wartość na konkretnym serwerze proxy interfejsu API, na którym wystąpił błąd. Jeśli istnieje jakaś zasada operacji mapowania par klucz-wartość, w której atrybut mapIdentifier jest ustawiony jako pusty ciąg, to jest przyczyną błędu.

    Na przykład ta zasada operacji mapowania par klucz-wartość ma pusty element 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>
    

Rozdzielczość

Sprawdź, czy atrybut mapIdentifier jest ustawiony na prawidłowe mapowanie par klucz-wartość w zasadach operacji mapowania par klucz-wartość.

Aby poprawić przykładową zasadę przedstawioną powyżej, możesz określić mapIdentifier w dotychczasowej mapie par klucz-wartość 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

Kod błędu

steps.keyvaluemapoperations.SetVariableFailed

Treść odpowiedzi o błędzie

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

Przykładowy komunikat o błędzie

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

Przyczyna

Ten błąd występuje, gdy próbujesz pobrać wartość z zaszyfrowanej mapy par kluczy i ustawić wartość na zmienną, której nazwa nie ma prefiksu private.. Prefiks jest wymagany do celów związanych z bezpieczeństwem podczas debugowania, więc ukrywa zaszyfrowane wartości w sesjach śledzenia serwera proxy interfejsu API i w sesjach debugowania.

Diagnostyka

1. Wskaż zasadę operacji na mapie według par klucz-wartość, w której wystąpił błąd, oraz nazwę zmiennej, dla której nie można ustawić tej wartości. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi o błędzie. Na przykład w tagu faultstring nazwa zasady to EncryptedKVM, a zmienna to myvar:

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

1. W pliku XML zasad dotyczących operacji mapowania par klucz-wartość sprawdź, czy nazwa zmiennej określonej w atrybucie assignTo elementu <Get> odpowiada nazwie zmiennej określonej w ciągu błędu (krok 1 powyżej). Na przykład ta zasada operacji mapowania par klucz-wartość określa w elemencie <Get> zmienną o nazwie myvar, która odpowiada zawartości w elemencie 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. Sprawdź, czy mapa par klucz-wartość określona w atrybucie mapIdentifier jest zaszyfrowanym KVM. Jeśli kluczowa maszyna wirtualna jest szyfrowana w zakresie środowiska, możesz sprawdzić, czy jest szyfrowana w interfejsie użytkownika Edge. W przeciwnym razie, jeśli zasób został utworzony w zakresie organizacji lub apiproxy, musisz użyć interfejsu Management API, aby sprawdzić, czy jest szyfrowany. Zobacz też artykuł Zarządzanie maszynami wirtualnymi i korzystanie z nich.

    Aby sprawdzić, czy w interfejsie użytkownika Edge jest szyfrowana maszyna wirtualna w zakresie środowiska:

    1. W interfejsie użytkownika Edge kliknij Admin (Administrator) w menu nawigacyjnym po lewej stronie.
    2. Kliknij Środowiska.
    3. Kliknij Mapy klucz-wartość.
    4. Odszukaj mapę klucz-wartość, której chcesz użyć.
    5. Kliknij strzałkę po lewej stronie nazwy, aby rozwinąć listę wartości.
    6. Mapy zaszyfrowanych par klucz-wartość wyświetlają wartości z gwiazdkami w interfejsie użytkownika (*****), tak jak to pokazano w artykule Informacje o szyfrowanych KVM.

    Aby sprawdzić, czy kluczowa maszyna wirtualna na poziomie organizacji, środowiska lub apiproxy jest szyfrowana, skorzystaj z interfejsów API do zarządzania. Jeśli używasz interfejsu API, przykładowa odpowiedź, która pokazuje zarówno zaszyfrowane ustawienie, jak i gwiazdki dla wartości, będzie wyglądać tak:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. Jeśli mapa par klucz-wartość jest zaszyfrowanym KVM, a nazwa zmiennej użyta w atrybucie assignTo elementu <Get> nie ma prefiksu private. To jest przyczyna błędu.

    W przedstawionej powyżej przykładowej zasadzie operacji mapowania par klucz-wartość mapa par klucz-wartość testEncrypted jest zaszyfrowana, a nazwa zmiennej myvar nie ma prefiksu private. W związku z tym otrzymujesz kod błędu:

    steps.keyvaluemapoperations.SetVariableFailed
    

Rozdzielczość

Jeśli używana mapa par klucz jest zaszyfrowana, nazwa zmiennej musi mieć prefiks private. w atrybucie assignTo elementu <Get> w zasadach operacji na mapie par klucz-wartość.

Aby poprawić przykładową zasadę operacji mapowania par klucz-wartość, którą pokazaliśmy powyżej, możesz zmienić wartość atrybutu assignTo na 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>