Key-Value マップ オペレーションのランタイム エラーのトラブルシューティング

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する。

UnsupportedOperationException

エラーコード

java.lang.UnsupportedOperationException

エラー レスポンスの本文

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

原因

このエラーは、mapIdentifier 属性が Key-Value マップ オペレーション ポリシーで空の文字列に設定されている場合に発生します。

診断

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

    たとえば、次の Key-Value マップ オペレーション ポリシーには空の 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 マップ オペレーション ポリシーと、値を設定できない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、EncryptedKVM がポリシー名、myvar が変数です。

  "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM"

1.エラーが発生した Key-Value マップ オペレーション ポリシーの XML で、<Get> 要素の assignTo 属性で指定された変数名が、障害文字列内で特定された変数名(上記の手順 1)に一致していることを確認します。たとえば、次の Key-Value マップ オペレーション ポリシーでは、<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>
  1. mapIdentifier 属性で指定された Key-Value マップが暗号化された KVM であることを確認します。

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

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

    上記の Key-Value マップ オペレーション ポリシーでは、Key-Value マップ testEncrypted が暗号化され、変数名 myvar に接頭辞 private がありません。このため、次のようなエラーコードが返されます。

    steps.keyvaluemapoperations.SetVariableFailed
    

解決策

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

上記の Key-Value マップ オペレーション ポリシーの例を修正するには、属性の値を 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>