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
変数、あるいはその他のカスタム変数に設定されている場合に、このエラーが発生します。
診断
エラーが発生した Assign Message Policy と使用できない変数の名前を特定します。どちらの項目も、エラー レスポンスの
faultstring
要素を調べるとわかります。たとえば、次の
faultstring
の場合、ポリシー名はgoogleBook
で、変数はvar
です。"faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
エラーが発生した 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>
この変数が、Assign Message ポリシーが実行されるフロー内で定義済みであり、使用可能であるかどうかを判定します。
変数が次のいずれかの状態になっていないか確認します。
- 範囲外(ポリシーが実行されている特定のフローで使用できない)
- 解決できない(定義されていない)
いずれかの状態が当てはまる場合、それがエラーの原因です。
たとえば、上記の 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 フロー変数 request
、response
、message
は、メッセージ型のものです。メッセージ変数の詳細については、変数リファレンスをご覧ください。
診断
エラーが発生した Assign Message ポリシーとタイプが不適切な変数の名前を特定します。どちらの項目も、エラー レスポンスの
faultstring
要素を調べるとわかります。たとえば、次のfaultstring
の場合、ポリシー名はGenerateGeocodingRequest
で、変数はPostalCode
です。"faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
エラーが発生した 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>
この変数がメッセージ型のものであるかどうかを判定します。
- API プロキシ バンドルで、最初にその変数が定義されたコードを特定します。
- その変数が最初に定義されて値が取り込まれるポリシーを特定したら、次のようにして変数のデータ型を特定する必要があります。
- type 属性の値を確認します(存在する場合)。
- type 属性がない場合、その変数は文字列と見なされます。
- 変数の型がメッセージ以外(文字列など)の場合、それがエラーの原因です。よく使われる変数とその型については、変数リファレンスをご覧ください。
たとえば、上記の 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>