键值对映射操作运行时错误问题排查

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>environment</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>environment</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"
    
  2. 在失败的键值对映射操作政策 XML 中,验证 <Get> 元素的 assignTo 特性中指定的变量名称与故障字符串中指定的变量名称(上述第 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>
    
  3. mapIdentifier 特性指定的键值对映射是否为加密 KVM。

    如需在 Apigee 界面中检查 KVM 是否已加密,请执行以下操作:

    1. 在 Apigee 界面中,点击左侧导航菜单中的管理
    2. 点击环境
    3. 点击键值对映射
    4. 找到要使用的键值对映射。
    5. 点击名称左侧的箭头,展开值列表。
    6. 已加密的键值对映射会在界面中显示使用星号 (***) 遮蔽的值,如关于加密的 KVM 中所示。
  4. 如果键值对映射是加密的 KVM,<Get> 元素的 assignTo 特性中使用的变量名称不包含前缀 private。那么就会导致错误。

    在上面显示的键值对映射操作政策中,键值对映射 testEncrypted 已加密,变量名称 myvar 没有前缀 private。因此,您会收到错误代码:

    steps.keyvaluemapoperations.SetVariableFailed
    

解决方法

如果使用的键值对映射已加密,确保变量名称在键值对映射操作政策 <Get> 元素的 assignTo 特性中具有前缀 private.

如需更正上面显示的键值对映射操作政策示例,您可以将 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>