Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
UnsupportedOperationException
Код ошибки
java.lang.UnsupportedOperationException
Тело ответа с ошибкой
{
"fault":{
"faultstring":"java.lang.UnsupportedOperationException",
"detail":{
"errorcode":"Internal Server Error"
}
}
}
Причина
Эта ошибка возникает, если атрибуту mapIdentifier присвоена пустая строка в правиле "Операции с картой значений ключей".
диагностика;
Изучите все правила для операций с картой значений ключей в определенном прокси 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>
Проверьте, является ли карта "ключ-значение", указанная в атрибуте
mapIdentifier, зашифрованной картой "ключ-значение". Если хранилище пар "ключ-значение" зашифровано на уровне среды, вы можете проверить, так ли это, в интерфейсе Edge. В противном случае, если хранилище было создано на уровне организации или прокси API, вам нужно использовать Management API, чтобы проверить, зашифровано ли оно. Также ознакомьтесь с информацией о том, как управлять парами "ключ-значение" и использовать их.Чтобы проверить, зашифровано ли хранилище пар "ключ-значение" с областью действия на уровне среды в интерфейсе Edge, выполните следующие действия:
- В интерфейсе Edge нажмите Admin (Администратор) в меню навигации слева.
- Нажмите Оформление приложения.
- Нажмите Карты пар "ключ-значение".
- Найдите нужную карту значений ключей.
- Нажмите на стрелку слева от названия, чтобы развернуть список значений.
- В зашифрованных картах "ключ-значение" значения в интерфейсе замаскированы звездочками (*****), как показано в разделе О зашифрованных картах "ключ-значение".
Чтобы проверить, зашифровано ли хранилище пар "ключ-значение" на уровне организации, среды или прокси API, используйте API управления. Если вы используете API, образец ответа, в котором показаны зашифрованная настройка и звездочки вместо значения, выглядит следующим образом:
{ "encrypted": true, "entry": [ { "name": "foo", "value": "*****" } ], "name": "encrypted" }Если карта "ключ-значение" является зашифрованной 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>