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

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

UnresolvedVariable

エラーコード

steps.assignmessage.UnresolvedVariable

エラー レスポンスの本文

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

原因

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

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

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

診断

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

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

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. エラーが発生した Assign Message ポリシーの XML で、使用されている変数名が faultstring(上記の手順 1)で特定された変数名と一致しているかどうかを確認します。たとえば、次のポリシーでは、<Copy> 要素のソース属性を 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> 要素のソース属性をリクエスト変数またはリクエスト フローに存在する message 型の他のカスタム変数に変更します。

<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 属性が message 型ではない変数に設定されている場合に発生します。

message 型の変数は HTTP リクエストおよびレスポンス全体を表します。組み込みの Apigee フロー変数である requestresponsemessage は message 型です。message 変数の詳細については、変数リファレンスをご覧ください。

診断

  1. エラーが発生した Assign Message ポリシーと、型が正しくない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、GenerateGeocodingRequest がポリシー名、PostalCode が変数です。

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. エラーが発生した JSON to XML ポリシーの XML で、<Copy> 要素に設定された変数の名前が faultstring(上記の手順 1)で特定された変数名と一致していることを確認します。たとえば、次のポリシーはソース属性を 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. この変数が message 型であるかどうかを判定します。

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

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

    PostalCode 変数は Assign Message ポリシーの <Copy> 要素で使われていることに注意してください。

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

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

    steps.assignmessage.VariableOfNonMsgType
    

解決策

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

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

<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>