Устранение неполадок при выполнении операций Key Value Map

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

UnsupportedOperationException

Код ошибки

java.lang.UnsupportedOperationException

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

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

Причина

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

Диагноз

  1. Проверьте все политики операций сопоставления ключей и значений в конкретном API-прокси, где произошла ошибка. Если в какой-либо политике операций сопоставления ключей и значений атрибут 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 выше). Например, следующая политика операций сопоставления ключей и значений указывает переменную с именем myvar в элементе <Get> , которая совпадает с именем в 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 карта ключ-значение зашифрованным KVM. Если KVM зашифрован на уровне среды, вы можете проверить это в пользовательском интерфейсе Edge. В противном случае, если он был создан на уровне организации или апипрокси, вам необходимо использовать API управления, чтобы проверить, зашифрован ли он. См. также раздел «Управление и использование KVM» .

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

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

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

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

    В приведенном выше примере политики операций с сопоставлением ключей и значений, сопоставление ключей и значений 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>