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, 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 API Proxy'sinde bulunan tüm Anahtar/Değer Eşleme İş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 Anahtar/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

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

Yukarıda gösterilen örnek politikayı düzeltmek için mapIdentifier politikasını mevcut bir anahtar/değer çiftiyle (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 bir değer almaya çalışır ve değeri, adında private. öneki olmayan bir değişken olarak ayarlarsanız ortaya çıkar. Hata ayıklama sırasında temel güvenlik amacıyla gerekli olan önek, şifrelenmiş değerleri API Proxy İzleme ve hata ayıklama oturumlarından gizler.

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'dir:

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

1. Başarısız Anahtar/Değer Eşleme İşlemleri politikası XML'inde, <Get> öğesinin assignTo özelliğinde belirtilen değişken adının, hata dizesinde (yukarıdaki 1. adım) tanımlanan değişken adıyla eşleştiğini doğrulayın. Örneğin, aşağıdaki Anahtar/Değer Eşleme İşlemleri politikası, <Get> öğesinde myvar adlı ve faultstring öğesinde bulunan 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şturulmuşsa şifreli olup olmadığını doğrulamak için Management API'yi kullanmanız gerekir. KVM'leri yönetme ve kullanma bölümünü de inceleyin.

    Ortam kapsamlı 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şlemesi'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 Haritaları, değerleri, Şifrelenmiş KVM'ler Hakkında bölümünde gösterildiği gibi kullanıcı arayüzünde yıldız işaretleriyle (*****) maskelenmiş olarak gösterir.

    Kuruluş, ortam veya apiproxy düzeyinde kapsama sahip bir KVM'nin şifrelenip şifrelenmediğini kontrol etmek için Management 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 eşlemesi şifrelenmiş bir KVM'ye sahipse ve <Get> öğesinin assignTo özelliğinde kullanılan değişken adı private önekine sahip değilse. Hatanın nedeni budur.

    Yukarıda gösterilen Anahtar/Değer Eşleme İşlemleri politikasında, testEncrypted anahtar/değer eşlemesi şifrelenmiştir ve myvar değişken adı private ön ekine sahip değildir. Bu durumda şu hata kodunu alırsınız:

    steps.keyvaluemapoperations.SetVariableFailed
    

Çözünürlük

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

Yukarıda gösterilen 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>