Assign Message のランタイム エラーのトラブルシューティング

UnresolvedVariable

エラーコード

steps.assignmessage.UnresolvedVariable
    

エラー レスポンスの本文

    {
        "fault": {
            "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
            "detail": {
                "errorcode": "steps.assignmessage.UnresolvedVariable"
            }
        }
    }
    

原因

このエラーは、Assign Message ポリシーで指定された変数が次のいずれかである場合に発生します。

  • 範囲外(ポリシーが実行されている特定のフローで使用できない)
  • 解決できない(定義されていない)

たとえば、Assign Message ポリシーがリクエスト フロー内で実行されているにもかかわらず、<Copy> 要素の source 属性がリクエスト フローに存在しない response 変数や error 変数、あるいはその他のカスタム変数に設定されている場合に、このエラーが発生します。

診断

  1. エラーが発生した Assign Message Policy と使用できない変数の名前を特定します。どちらの項目も、エラー レスポンスの faultstring 要素を調べるとわかります。

    たとえば、次の faultstring の場合、ポリシー名は googleBook で、変数は var です。

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
        
  2. エラーが発生した Assign Message Policy XML で、使用された変数の名前が障害文字列(faultstring)(上記のステップ 1)で特定された変数名と一致することを確認します。たとえば、次のポリシーは <Copy> 要素の source 属性を var という変数に設定しており、faultstring の内容と一致します。

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
           <DisplayName>googleBook</DisplayName>
           <Properties />
           <Copy source="var">
              <Headers>
                 <Header name="user-agent" />
              </Headers>
           </Copy>
           <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
           <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
        </AssignMessage>
        
  3. この変数が、Assign Message ポリシーが実行されるフロー内で定義済みであり、使用可能であるかどうかを判定します。

  4. 変数が次のいずれかの状態になっていないか確認します。

    1. 範囲外(ポリシーが実行されている特定のフローで使用できない)
    2. 解決できない(定義されていない)

    いずれかの状態が当てはまる場合、それがエラーの原因です。

    たとえば、上記の Assign Message ポリシーがリクエスト フローで実行されるとします。リクエスト フロー内で Assign Message ポリシーに先行して実行されるポリシーのいずれかで、変数 var が定義されているかどうかを確認します。この変数が定義されていない場合は、次のようにエラーコードが表示されます。

    steps.assignmessage.UnresolvedVariable
        

解決策

Assign Message が実行されるフローで、ポリシーで参照される変数が存在し、使用可能であることを確認します。

上記の例のポリシーを修正するには、<Copy> 要素の source 属性をリクエスト変数や、リクエスト フローに存在するデータ型がメッセージのカスタム変数のいずれかに変更します。

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="request">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    

VariableOfNonMsgType

エラーコード

steps.assignmessage.VariableOfNonMsgType
    

エラー レスポンスの本文

    {
        "fault": {
            "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
            "detail": {
                "errorcode": "steps.assignmessage.VariableOfNonMsgType"
            }
        }
    }
    

原因

このエラーは <Copy> 要素の source 属性がメッセージ型以外の変数に設定されている場合に発生します。

メッセージ型の変数は、HTTP リクエストとレスポンス全体を表します。組み込みの Edge フロー変数 requestresponsemessage は、メッセージ型のものです。メッセージ変数の詳細については、変数リファレンスをご覧ください。

診断

  1. エラーが発生した Assign Message ポリシーとタイプが不適切な変数の名前を特定します。どちらの項目も、エラー レスポンスの faultstring 要素を調べるとわかります。たとえば、次の faultstring の場合、ポリシー名は GenerateGeocodingRequest で、変数は PostalCode です。

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
        
  2. エラーが発生した Assign Message Policy XML で、<Copy> 要素に設定された変数の名前が faultstring で特定された変数名(上記のステップ 1)と一致することを確認します。たとえば、次のポリシーは source 属性を PostalCode という変数に設定しており、これは faultstring の内容と一致します。

    <AssignMessage name="GenerateGeocodingRequest">
           <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
           <AssignVariable>
              <Name>PostalCode</Name>
              <Ref>request.queryparam.postalcode</Ref>
           </AssignVariable>
           <AssignVariable>
              <Name>Country</Name>
              <Ref>request.queryparam.country</Ref>
           </AssignVariable>
           <Copy source="PostalCode">
              <QueryParams>
                 <QueryParam name="q" />
              </QueryParams>
           </Copy>
        </AssignMessage>
        
  3. この変数がメッセージ型のものであるかどうかを判定します。

    1. API プロキシ バンドルで、最初にその変数が定義されたコードを特定します。
    2. その変数が最初に定義されて値が取り込まれるポリシーを特定したら、次のようにして変数のデータ型を特定する必要があります。
      1. type 属性の値を確認します(存在する場合)。
      2. type 属性がない場合、その変数は文字列と見なされます。
    3. 変数の型がメッセージ以外(文字列など)の場合、それがエラーの原因です。よく使われる変数とその型については、変数リファレンスをご覧ください。

    たとえば、上記の XML の PostalCode 変数を見てみましょう。これは <AssignVariable> 要素のフロー変数 request.queryparam.postalcode の値が割り当てられています。この値は、変数の割り当てに type 属性が存在しないため、文字列です。

    ここで、PostalCode 変数が Assign Message ポリシーの <Copy> 要素で使用されていることを思い出してください。

    <Copy source="PostalCode">
           <QueryParams>
              <QueryParam name="PostalCode" />
           </QueryParams>
        </Copy>
        

    PostalCode はメッセージ型ではないため(この例では文字列)、次のようなエラーコードが表示されます。

    steps.assignmessage.VariableOfNonMsgType
        

解決策

エラーが発生した Assign Message ポリシーの <Copy> 要素の source 属性が、存在するメッセージ型のフロー変数に設定されていることを確認します。

ポリシーを修正するには、<Copy> 要素の source 属性がメッセージ型の変数を指定するように変更します。たとえば、Assign Message ポリシーがリクエスト フローで実行されると想定される場合は、メッセージ型の変数 request や、他のメッセージ型のカスタム変数を使用できます。

<AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="request">
          <QueryParams>
             <QueryParam name="PostalCode" />
          </QueryParams>
       </Copy>
    </AssignMessage>