Key Value Map Operations ランタイム エラーのトラブルシューティング

UnsupportedOperationException

エラーコード

java.lang.UnsupportedOperationException

エラー レスポンスの本文

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

原因

このエラーは、mapIdentifier 属性が Key Value Map Operations ポリシーで空の文字列に設定されている場合に発生します。

診断

  1. エラーが発生した特定の API プロキシで、すべての Key Value Map Operations ポリシーを調べます。mapIdentifier 属性が空の文字列として設定されている Key Value Map Operations ポリシーがある場合、これがエラーの原因です。

    たとえば、次の Key Value Map Operations ポリシーには空の 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>
    

解決策

Key-Value Map Operations ポリシーで、属性 mapIdentifier が有効な Key-Value マップに設定されていることを確認します。

上記のポリシーの例を修正するには、mapIdentifier を既存の Key-Value マップ 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"
      }
   }
}

原因

このエラーは、暗号化された Key-Value マップから値を取得し、名前に接頭辞 private. がない変数に値を設定しようとすると発生します。デバッグ時の基本的なセキュリティのために必須なこの接頭辞により、API プロキシ Trace およびデバッグ セッションで、暗号化された値は表示されません。

診断

  1. エラーが発生した Key Value Map Operations ポリシーと、値を設定できない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、EncryptedKVM がポリシー名、myvar が変数です。

    "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM"
    
  2. エラーが発生した Key Value Map Operations ポリシーの XML で、<Get> 要素の assignTo 属性で指定された変数名が、障害文字列内で特定された変数名(上記の手順 1)に一致していることを確認します。たとえば、次の Key Value Map Operations ポリシーでは、<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 属性で指定された Key-Value マップが暗号化された KVM であることを確認します。

    Apigee UI で KVM が暗号化されているかどうかを確認するには:

    1. Apigee UI で、左側にあるナビゲーション メニューの [Admin] をクリックします。
    2. [Environments] をクリックします。
    3. [Key-Value マップ] をクリックします。
    4. 使用する Key-Value マップを探します。
    5. 値の一覧を展開するには、名前の左側にある矢印をクリックします。
    6. 暗号化された KVM についての説明のように、暗号化された Key-Value マップの値はアスタリスクでマスクされて UI に表示されます(*****)。
  4. Key-Value マップが暗号化された KVM で、<Get> 要素の assignTo 属性で使用される変数名に接頭辞 private が付いていない場合。該当する場合は、それがエラーの原因です。

    上記の Key Value Map Operations ポリシーの例では、Key-Value マップ testEncrypted が暗号化され、変数名 myvar に接頭辞 private がありません。したがって、次のエラーコードを受け取ります。

    steps.keyvaluemapoperations.SetVariableFailed
    

解決策

使用する Key-Value マップが暗号化されている場合は、Key Value Map Operations ポリシーで、<Get> 要素の assignTo 属性に接頭辞 private. があることを確認します。

上記の Key Value Map Operations ポリシーの例を修正するには、属性の値を 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>