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

Apigee Edge belgelerini görüntülüyorsunuz.
Git: Apigee X belgeleri.
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, mapIdentifier özelliği Anahtar/Değer Eşleme İşlemleri politikasında boş bir dizeye ayarlanırsa ortaya çıkar.

Teşhis

  1. Hatanın oluştuğu ilgili API Proxy'sinde tüm Anahtar/Değer Eşleme İşlemleri politikalarını inceleyin. mapIdentifier özelliğinin boş dize olarak ayarlandığı Anahtar/Değer Eşleme İşlemleri politikası varsa hatanın nedeni budur.

    Örneğin, aşağıdaki Temel Değer Eşleme İş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

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

Yukarıda gösterilen örnek politikayı düzeltmek için mapIdentifier özelliğini, mevcut bir anahtar/değer eşlemesi UserLocationMap ile 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ş anahtar/değer eşlemesinden bir değer almaya çalışırsanız ortaya çıkar ve değeri, adında private. öneki olmayan bir değişkene ayarlayın. İlgili içeriği oluşturmak için kullanılan ön eki; hata ayıklama sırasında temel güvenlik amaçları için gerekli olan API proxy İzleme ve hata ayıklama oturumlarındaki şifrelenmiş değerler.

Teşhis

1. Hatanın oluştuğu Anahtar/Değer Eşlemesi İşlemleri politikasını ve değerin ayarlanamayacağı değişkenin adını tanımlayın. Bu öğelerin ikisini de hata yanıtının faultstring öğesinde bulabilirsiniz. Örneğin, aşağıdaki faultstring politikasında politika adı EncryptedKVM, değişken ise myvar şeklindedir:

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

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

  <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 sanal makinenin şifrelendiğini doğrulayabilirsiniz bölümünü ziyaret edin. Aksi takdirde, kuruluş veya apiproxy kapsamında oluşturulduysa API'nin şifrelenip şifrelenmediğini kontrol etmesini sağlar. KVM'leri yönetme ve kullanma başlıklı makaleyi de inceleyin.

    Kapsamındaki KVM'nin, Edge kullanıcı arayüzünde şifrelenip şifrelenmediğini kontrol etmek için:

    1. Edge kullanıcı arayüzünde, sol gezinme menüsünden Admin'i (Yönetici) 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şlemesi'ni bulun.
    5. Değerler listesini genişletmek için adın solundaki oku tıklayın.
    6. Şifrelenmiş Anahtar/Değer Eşlemesi haritaları, Ş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ğerleri (*****) gösterir.

    Kuruluş, ortam veya apiproxy düzeyinde kapsamlandırılmış bir KVM'nin şifrelenmiş olup olmadığını kontrol etmek için Yönetim API'lerini kullanın. URL'yi API'de değer için hem şifrelenmiş ayarı hem de yıldız işaretlerini gösteren örnek bir yanıt aşağıdaki gibi görünür:

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

    Yukarıda gösterilen örnek Anahtar/Değer Eşleme İşlemleri politikasında, testEncrypted anahtar/değer eşlemesi şifrelenmiş ve myvar değişken adı private önekine sahip değil. Bu nedenle şu hata kodunu alıyorsunuz:

    steps.keyvaluemapoperations.SetVariableFailed
    

Çözünürlük

Kullanılan anahtar/değer eşleme şifrelenmişse değişken adının, Anahtar/Değer Eşleme İşlemleri politikasındaki <Get> öğesinin assignTo özelliğinde private. ön ekine sahip olduğundan emin olun.

Yukarıda gösterilen örnek Anahtar/Değer Eşleme İşlemleri politikasını düzeltmek için assignTo özelliğinin private.myvar ile değeri:

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