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

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 dize olarak ayarlanırsa ortaya çıkar.

Teşhis

  1. Hatanın oluştuğu belirli API Proxy'sindeki tüm Anahtar Değer Haritası İşlemleri politikalarını inceleyin. mapIdentifier özelliğinin boş dize olarak ayarlandığı bir 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 değerini mevcut bir anahtar/değer eşleme 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ş bir anahtar/değer eşlemesinden bir değer almaya çalışır ve değeri, adında private. ön eki olmayan bir değişkene ayarlarsanız ortaya çıkar. Hata ayıklama sırasında temel güvenlik amacıyla gerekli olan ön ek, şifrelenmiş değerleri API proxy izleme ve hata ayıklama oturumlarından gizler.

Teşhis

1. Hatanın oluştuğu Anahtar Değer Haritası İşlemleri politikasını ve değerin ayarlanamadığı 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'te politika adı EncryptedKVM ve değişken myvar'dir:

  "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 Edge kullanıcı arayüzünde şifrelenmiş olduğunu doğrulayabilirsiniz. Aksi takdirde, kuruluş veya apiproxy kapsamında oluşturulduysa şifrelenmiş olup olmadığını doğrulamak için Management API'yi kullanmanız gerekir. 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ünde 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ş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. API'yi kullanırsanız 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 Anahtar/Değer Eşleme İşlemleri politikası örneğinde, testEncrypted anahtar/değer eşleme şifrelenir ve myvar değişken adında private ön eki yoktur. 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 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>