Anahtar/Değer Eşleme İşlemleri çalışma zamanı hatasıyla ilgili sorunları giderme

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

UnsupportedOperationException

Hata kodu

java.lang.UnsupportedOperationException

Hata yanıtı gövdesi

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

Neden

Bu hata, Anahtar Değer Haritası İşlemleri politikasında mapIdentifier özelliği boş bir dizeye ayarlanırsa oluşur.

Teşhis

  1. Başarısızlığın meydana geldiği API proxy'sindeki tüm Key Value Map Operations politikalarını inceleyin. mapIdentifier özelliğinin boş dize olarak ayarlandığı bir Key Value Map Operations politikası varsa hatanın nedeni budur.

    Örneğin, aşağıdaki Anahtar Değeri Haritası İşlemleri politikasında boş bir mapIdentifier var:

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

Çözünürlük

mapIdentifier özelliğinin, Anahtar/Değer Eşlemesi İşlemleri politikasında geçerli bir anahtar/değer eşlemesi olarak ayarlandığından emin olun.

Yukarıda gösterilen örnek politikayı düzeltmek için mapIdentifier değerini mevcut bir anahtar/değer eşlemesine UserLocationMap belirtebilirsiniz.

<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

Hata kodu

steps.keyvaluemapoperations.SetVariableFailed

Hata yanıtı gövdesi

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

Örnek hata mesajı

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

Neden

Bu hata, şifrelenmiş bir anahtar-değer eşlemesinden değer almaya çalışırsanız ve değeri, adında private. öneki olmayan bir değişkene ayarlarsanız oluşur. Hata ayıklama sırasında temel güvenlik amacıyla gerekli olan önek, şifrelenmiş değerleri API proxy'si izleme ve hata ayıklama oturumlarından gizler.

Teşhis

1. Hataya neden olan Key Value Map Operations politikasını ve değerin ayarlanamadığı değişkenin adını belirleyin. Bu öğelerin ikisini de hata yanıtının faultstring öğesinde bulabilirsiniz. Örneğin, aşağıdaki faultstring içinde politika adı EncryptedKVM, değişken ise myvar'dir:

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

1. Başarısız olan Key Value Map Operations politikası XML'sinde, <Get> öğesinin assignTo özelliğinde belirtilen değişkenin adının, hata dizesinde tanımlanan değişken adıyla (yukarıdaki 1. adım) eşleştiğini doğrulayın. Örneğin, aşağıdaki Anahtar Değer Haritası İşlemleri politikası, <Get> öğesinde myvar adlı bir değişken belirtir. Bu değişken, faultstring öğesindekiyle eşleşir:

  <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. mapIdentifier özelliğinde belirtilen anahtar/değer eşlemesinin şifrelenmiş bir KVM olup olmadığını kontrol edin. KVM ortam kapsamında şifrelenmişse Edge kullanıcı arayüzünde şifrelendiğini doğrulayabilirsiniz. Aksi takdirde, kuruluş veya apiproxy kapsamında oluşturulduysa şifrelenip şifrelenmediğini doğrulamak için Management API'yi kullanmanız gerekir. KVM'leri yönetme ve kullanma başlıklı makaleyi de inceleyin.

    Edge kullanıcı arayüzünde ortam kapsamlı bir Kernel Tabanlı Sanal Makine'nin şifrelenip şifrelenmediğini kontrol etmek için:

    1. Edge kullanıcı arayüzünde, sol gezinme menüsünden Yönetici'yi tıklayın.
    2. Ortamlar'ı tıklayın.
    3. Anahtar Değer Eşlemeleri'ni tıklayın.
    4. Kullanmak istediğiniz anahtar değer eşlemesini bulun.
    5. Değer listesini genişletmek için adın solundaki oku tıklayın.
    6. Şifrelenmiş anahtar/değer eşlemeleri, Şifrelenmiş KVM'ler hakkında bölümünde gösterildiği gibi kullanıcı arayüzünde yıldız işaretleriyle maskelenmiş değerler (*****) gösterir.

    Kuruluş, ortam veya apiproxy düzeyinde kapsamı belirlenmiş bir KVM'nin şifrelenip şifrelenmediğini kontrol etmek için Yönetim API'lerini kullanın. API'yi kullanıyorsanız hem şifrelenmiş ayarı hem de değer için yıldız işaretlerini gösteren örnek bir yanıt şu şekilde görünür:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. Anahtar/değer eşlemesi şifrelenmiş bir KVM ise ve <Get> öğesinin assignTo özelliğinde kullanılan değişken adında private öneki yoksa. Bu durumda hatanın nedeni budur.

    Yukarıda gösterilen örnek Anahtar/Değer Çifti Haritası İşlemleri politikasında, anahtar/değer çifti haritası testEncrypted şifrelenmiştir ve değişken adı myvar, private önekine sahip değildir. Bu nedenle şu hata kodunu alırsınız:

    steps.keyvaluemapoperations.SetVariableFailed
    

Çözünürlük

Kullanılan anahtar-değer eşlemesi şifrelenmişse Key Value Map Operations (Anahtar-Değer Eşlemesi İşlemleri) politikasındaki <Get> öğesinin assignTo özelliğinde değişken adının private. önekine sahip olduğundan emin olun.

Yukarıda gösterilen örnek Anahtar/Değer Haritası İşlemleri politikasını düzeltmek için assignTo özelliğinin değerini private.myvar olarak değiştirebilirsiniz:

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