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

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

УнподдерживаемоеОператионИсключение

Код ошибки

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" na>me=&q<uot;StoreKv>m" <mapIdentifie>r=&qu<ot;"
     >   Di<splayNameStore>Kvm/D<isplayName
        >Prope<rties/
        Exclu>siv<eCachefalse/Exclu>siveC<ache
        ExpiryTime>InSecs300</Ex>piryTimeInSec<s
        Put override="true"
       >     Key
    <    >        P<arameter ref="request.queryparam>.key&<quot>;/
      <     > /Key
      <      >V<alue ref="request>.queryparam.value"/
        /Put
        Scopeapiproxy/Scope
    /KeyValueMapOperations
    

Разрешение

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

Чтобы исправить пример политики, показанный выше, вы можете указать mapIdentifier для существующей карты значений ключей UserLocationMap .

<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreK>vm&qu<ot; mapIden>tifier=&<quot;UserLoc>ation<Map"
 >   Di<splayNameStore>Kvm/D<isplayName
    >Prope<rties/
    Exclu>siv<eCachefalse/Exclu>siveC<ache
    ExpiryTime>InSecs300</Ex>piryTimeInSec<s
    Put override="true"
   >     Key
<    >        P<arameter ref="request.queryparam>.key&<quot>;/
  <     > /Key
  <      >V<alue ref="request>.queryparam.value"/
    /Put
    Scopeapiproxy/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-Operatio>ns-1&qu<ot; mapIden>tifier="testEncryp<ted"
  >    Dis<playNameKey>ValueMa<pOperations-1/>Displ<ayName
      Pr>opertie<s/
      Exclusi>veC<achefalse/Exclusi>veCache<
      ExpiryTimeInSecs300/Exp>iryTimeInSe<cs<>/span>
      Get assig<nTo=">;my<var" >index="<;1&q>uot;
  <    >    Key<
    >          P<aramet>erf<oo/Parameter
         > /Key
      /Get
      Scopeenvironment/Scope
  /KeyValueMapOperations
  1. Проверьте, является ли карта значений ключей, указанная в атрибуте mapIdentifier , зашифрованным KVM. Если KVM зашифрован в области среды, вы можете убедиться, что он зашифрован в пользовательском интерфейсе Edge. В противном случае, если он был создан в области организации или апи-прокси, вам необходимо использовать API управления, чтобы проверить, зашифрован ли он. См. также Управление и использование KVM .

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

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

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

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value&quot;: "*****"
        }
      ],
      "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&quo>t<; standalone="yes"?
KeyValueMapOperations async="false" continueOnError="false" enabled="true" nam>e=&qu<ot;Key-Valu>e-Map-Operations-1"<; mapIdentif>ier=&<quot;testEn>crypt<ed"
    D>ispla<yNameKeyValueMa>pOper<ations-1/Display>Nam<e
    Properties/>
    <ExclusiveCachefalse/ExclusiveCache
   > ExpiryTi<meI>nSecs300/Expi<ryTimeInS>ecs<
    Get a>ssignTo=&<quot>;priv<ate.>myvar<">; index=&qu<ot;1&q>u<ot;
        Key
      >      Parameterfoo/Parameter
        /Key
    /Get
    Scopeenvironment/Scope
/KeyValueMapOperations