Устранение ошибок выполнения операций с картой пар "ключ-значение"

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

UnsupportedOperationException

Код ошибки

java.lang.UnsupportedOperationException

Тело ответа с ошибкой

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

Причина

Эта ошибка возникает, если атрибуту mapIdentifier присвоена пустая строка в правиле "Операции с картой значений ключей".

диагностика;

  1. Изучите все правила для операций с картой значений ключей в определенном прокси API, в котором произошел сбой. Если в каком-либо правиле Key Value Map Operations атрибут mapIdentifier задан как пустая строка, это и является причиной ошибки.

    Например, в приведенном ниже правиле "Операции с картой значений ключей" отсутствует значение 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>
    

Разрешение

Убедитесь, что атрибуту mapIdentifier задано допустимое сопоставление пар "ключ-значение" в правиле "Операции с сопоставлением пар "ключ-значение".

Чтобы исправить пример правил, приведенный выше, вы можете указать mapIdentifier для существующей карты пар "ключ-значение" 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

Код ошибки

steps.keyvaluemapoperations.SetVariableFailed

Тело ответа с ошибкой

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

Пример сообщения об ошибке

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

Причина

Эта ошибка возникает, если вы пытаетесь получить значение из зашифрованной карты "ключ-значение" и задать его для переменной, название которой не начинается с префикса private.. Префикс, который необходим для базовой безопасности при отладке, скрывает зашифрованные значения от трассировки прокси-сервера API и сеансов отладки.

диагностика;

1. Определите правило операций с картой значений ключей, в котором произошла ошибка, и название переменной, для которой не удалось задать значение. Оба этих элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующем теге faultstring название правила – EncryptedKVM, а переменная – myvar:

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

1. В XML-файле правил "Операции с картой значений ключей", которые не удалось выполнить, убедитесь, что название переменной, указанное в атрибуте assignTo элемента <Get>, совпадает с названием переменной, указанным в строке ошибки (шаг 1 выше). Например, в следующем правиле операций с картой пар "ключ-значение" в элементе <Get> указана переменная myvar, которая соответствует элементу 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. Проверьте, является ли карта "ключ-значение", указанная в атрибуте mapIdentifier, зашифрованной картой "ключ-значение". Если хранилище пар "ключ-значение" зашифровано на уровне среды, вы можете проверить, так ли это, в интерфейсе Edge. В противном случае, если хранилище было создано на уровне организации или прокси API, вам нужно использовать Management API, чтобы проверить, зашифровано ли оно. Также ознакомьтесь с информацией о том, как управлять парами "ключ-значение" и использовать их.

    Чтобы проверить, зашифровано ли хранилище пар "ключ-значение" с областью действия на уровне среды в интерфейсе Edge, выполните следующие действия:

    1. В интерфейсе Edge нажмите Admin (Администратор) в меню навигации слева.
    2. Нажмите Оформление приложения.
    3. Нажмите Карты пар "ключ-значение".
    4. Найдите нужную карту значений ключей.
    5. Нажмите на стрелку слева от названия, чтобы развернуть список значений.
    6. В зашифрованных картах "ключ-значение" значения в интерфейсе замаскированы звездочками (*****), как показано в разделе О зашифрованных картах "ключ-значение".

    Чтобы проверить, зашифровано ли хранилище пар "ключ-значение" на уровне организации, среды или прокси API, используйте API управления. Если вы используете API, образец ответа, в котором показаны зашифрованная настройка и звездочки вместо значения, выглядит следующим образом:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. Если карта "ключ-значение" является зашифрованной KVM, а название переменной, используемое в атрибуте assignTo элемента <Get>, не имеет префикса private. Значит, причина ошибки в этом.

    В примере выше в правиле Key Value Map Operations карта testEncrypted зашифрована, а у переменной myvar нет префикса private. Поэтому вы получаете код ошибки:

    steps.keyvaluemapoperations.SetVariableFailed
    

Разрешение

Если используется зашифрованная карта "ключ-значение", убедитесь, что название переменной имеет префикс private. в атрибуте assignTo элемента <Get> в правиле "Операции с картой "ключ-значение".

Чтобы исправить пример политики "Операции с картой пар "ключ-значение", показанный выше, можно изменить значение атрибута assignTo на 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>