XML to JSON ポリシーのランタイム エラーのトラブルシューティング

Apigee X のドキュメントを表示中です。
Apigee Edge のドキュメントを表示する。

SourceUnavailable

エラーコード

steps.xml2json.SourceUnavailable

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: Source [source_variable] is not available",
        "detail": {
            "errorcode": "steps.xmltojson.SourceUnavailable"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "XMLToJSON[Convert-XMLToJSON]: Source response is not available",
        "detail": {
            "errorcode": "steps.xml2json.SourceUnavailable"
        }
    }
}

原因

このエラーは、XML to JSON ポリシーの <Source> 要素で指定されたメッセージ、または文字列変数が次のいずれかの状態である場合に発生します。

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

たとえば、XML to JSON ポリシーがリクエスト フローで実行されなければならないにもかかわらず、このリクエスト フローに存在しない response 変数に <Source> 要素が設定されている場合に、このエラーが発生します。

診断

  1. エラーが発生した XML to JSON ポリシーと、使用できない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、Convert-XMLToJSON がポリシー名、response が変数です。

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Source response is not available"
    
  2. エラーが発生した XML to JSON ポリシーの XML で、<Source> 要素内に設定された変数名が、faultstring で特定した変数名(上記のステップ 1)に一致していることを確認します。たとえば、次の XML to JSON ポリシーでは、<Source> 要素で response という名前の変数を指定しています。この変数名は、faultstring で特定した変数名と一致しています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Format>google</Format>
        <OutputVariable>response</OutputVariable>
        <Source>response</Source>
    </XMLToJSON>
    
  3. <Source> 要素で使われている変数が定義されていて、XML to JSON ポリシーが実行されるフローで使用できることを確認します。

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

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

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

    たとえば、上記の XML to JSON ポリシーがリクエスト フローで実行されるとします。response 変数は XML to JSON ポリシーの <Source> 要素で使われていることを思い出してください。response 変数はレスポンス フローでのみ使用できます。

    response 変数はリクエスト フローには存在しないため、このエラーを受け取ることになります。

    steps.xml2json.SourceUnavailable
    

解決策

エラーが発生した XML to JSON ポリシーの <Source> 要素に設定された変数が定義済みであり、ポリシーが実行されるフローにその変数が存在することを確認します。

上記の XML to JSON ポリシーの例を修正するには、リクエスト フローに存在している request 変数を使用するように、<Source> 要素を変更します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
    <DisplayName>Convert-XMLToJSON</DisplayName>
    <Properties/>
    <Format>google</Format>
    <OutputVariable>response</OutputVariable>
    <Source>request</Source>
</XMLToJSON>

ExecutionFailed

エラーコード

steps.xml2json.ExecutionFailed

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: Execution failed. reason: Premature end of document while parsing at line [line_number](possibly  around char [character_number])",
        "detail": {
            "errorcode": "steps.xml2json.ExecutionFailed"
        }
    }
}

考えられる原因

このエラーには、次の原因が考えられます。

原因 説明
入力ペイロードがない 入力ペイロード(XML)が空です。
入力が無効か、形式が正しくない XML to JSON ポリシーに渡された入力(XML)が無効であるか不正な形式です。

原因: 入力ペイロードがない

XML to JSON ポリシーで、<Source> 要素内で指定されている変数の内容(ペイロード)が空の場合、このエラーが発生します。

たとえば、XML to JSON ポリシー内の <Source> 要素が request 変数あるいは response 変数として設定されているとします。この変数には XML のペイロードが格納されなければなりませんが、ペイロードが空であると、このエラーが発生します。

診断

  1. エラーが発生した XML to JSON ポリシーを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring では、ポリシー名は Convert-XMLToJSON です。

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Execution failed. reason: Premature end of document while parsing at line 1(possibly  around char 0)"
    
  2. エラーが発生した XML to JSON ポリシーの XML に含まれる <Source> 要素を調べて、指定された変数を特定します。たとえば、次の XML to JSON ポリシーには、リクエストする <Source> 要素が設定されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Options>
            <RecognizeNumber>true</RecognizeNumber>
            <RecognizeBoolean>true</RecognizeBoolean>
            <RecognizeNull>true</RecognizeNull>
        </Options>
        <OutputVariable>request</OutputVariable>
        <Source>request</Source>
    </XMLToJSON>
    
  3. XMLToJSON ポリシーの <Source> 要素に指定された変数が空かどうか確認します。要素が空の場合は、それがエラーの原因です。

    上記の XML to JSON ポリシーの例では、クライアントから送信されたリクエストのペイロード(つまり、リクエストの本文)が空になっています。

    例:

    curl -v "http://your_host_alias/v1/testxmltojson" -H "Content-Type: application/xml"
    

    ここで、your_host_alias は、オーバーライド ファイルの virtualhosts.hostAliases プロパティで構成され、API へのアクセスに使用される公開ドメインです。構成のオーバーライドを指定するをご覧ください。

    XML リクエストのペイロードが空のため、次のエラーコードを受け取ります。

    steps.xml2json.ExecutionFailed
    

    <Source> 要素が response に設定されている場合でも、バックエンド サーバーから空のペイロードが渡されると、このエラーが発生することがあります。

解決策

<Source> 要素を介して XML to JSON ポリシーに渡される入力が有効な XML ペイロードであり、空でないことを確認します。

上記の XML to JSON ポリシーの例の問題を修正するには、有効な XML ペイロードを渡します。次に例を示します。

  1. city.xml という名前のファイルを作成し、次の内容を含めます。

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <City>Bengaluru</City>
       <Name>Apigee</Name>
       <Pincode>560016</Pincode>
    </root>
    
  2. 次の cURL コマンドを使用して API を呼び出します。

    curl -v "http://your_host_alias/v1/testxmltojson" -H "Content-Type: application/xml" -X POST -d @company.xml
    

    ここで、your_host_aliasは、オーバーライド ファイルの virtualhosts.hostAliases プロパティで構成された、API へのアクセスに使用される公開ドメインです。 構成のオーバーライドを指定するをご覧ください。

原因: 入力が無効であるか形式が正しくない

XML to JSON ポリシーが、無効あるいは不正な形式の入力を解析した場合、このエラーが発生します。

たとえば、次の無効な JSON が入力として XML to JSON ポリシーに渡されたとします。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <City>Bengaluru</City>
   <Name>Apigee</Name>
   <Pincode>560016</Pincode>

この場合、次のエラーを受け取ります。

"faultstring": "XMLToJSON[Convert-XMLToJSON]: Execution failed. reason: Premature end of document while parsing at line 6(possibly  around char 0)"

診断

  1. エラーが発生した XML to JSON ポリシーを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring では、ポリシー名は Convert-XMLToJSON です。

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Execution failed. reason: Premature end of document while parsing at line 6(possibly  around char 0)"
    
  2. エラーが発生した XML to JSON ポリシーの XML で指定された <Source> 要素を調べます。たとえば、次の XML to JSON ポリシーでは、<Source> 要素が request 変数に設定されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Options>
            <RecognizeNumber>true</RecognizeNumber>
            <RecognizeBoolean>true</RecognizeBoolean>
            <RecognizeNull>true</RecognizeNull>
        </Options>
        <OutputVariable>request</OutputVariable>
        <Source>request</Source>
    </XMLToJSON>
    
  3. <Source> 要素で XML To JSON ポリシーに指定された入力が有効な XML ペイロードであるかどうかを確認します。入力が無効か不正な形式である場合、それがエラーの原因です。

    上記の XML to JSON ポリシーの例では、city.xml ファイルから次の無効な XML が Extract Variables ポリシーに渡されていました。

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <City>Bengaluru</City>
       <Name>Apigee</Name>
       <Pincode>560016</Pincode>
    

    次の API 呼び出しの例は、リクエストがどのように渡されたかを示しています。

    curl -v "http://your_host_alias/v1/testxmltpjson" -H "Content-Type: application/xml" -X POST -d @city.xml
    

    ここで、your_host_alias は、オーバーライド ファイルの virtualhosts.hostAliases プロパティで構成され、API へのアクセスに使用される公開ドメインです。構成のオーバーライドを指定するをご覧ください。

    XML に <root> 要素の終了タグがないため、API に渡された XML ペイロードは無効です。したがって、 エラーコードを受け取ります。

    steps.xml2json.ExecutionFailed
    

    <Source> 要素が response に設定された場合でも、バックエンド サーバーからの XML レスポンスのペイロードが無効あるいは不正な形式であると、このエラーが発生することがあります。

解決策

<Source> 要素によって XML to JSON ポリシーに渡される入力が、有効で不正な形式ではないことを確認します。

上記で説明した XML to JSON ポリシーの例の問題を修正するには、次のように有効な XML ペイロードのリクエストを渡します。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <City>Bengaluru</City>
   <Name>Apigee</Name>
   <Pincode>560016</Pincode>
</root>

OutputVariableIsNotAvailable

エラーコード

steps.xml2json.OutputVariableIsNotAvailable

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: Output variable is not available.",
        "detail": {
            "errorcode": "steps.xml2json.OutputVariableIsNotAvailable"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "XMLToJSON[Convert-XMLToJSON]: Output variable is not available.",
        "detail": {
            "errorcode": "steps.xml2json.OutputVariableIsNotAvailable"
        }
    }
}

原因

このエラーは、XML to JSON ポリシーの <Source> 要素で指定された変数が string 型であり、<OutputVariable> 要素が定義されていない場合に発生します。<Source> 要素で定義された変数の型が string の場合、<OutputVariable> 要素は必須です。

診断

  1. エラーが発生した XML to JSON ポリシーを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring では、ポリシー名は Convert-XMLToJSON です。

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Output variable is not available."
    
  2. エラーが発生した XML to JSON ポリシーで、<OutputVariable> がないかどうか確認します。

    次の XML to JSON ポリシーの例には、<OutputVariable> 要素がありません。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Format>google</Format>
        <Source>TrackingNumber</Source>
    </XMLToJSON>
    
    
  3. 次のようにして <Source> 要素で指定された変数の型を特定します。

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

    たとえば、上記の XML to JSON ポリシーに含まれる TrackingNumber 変数に注目してください。この変数の型は string です。ここで、次のように Assign Message ポリシーを使用して、変数 TrackingNumber に値を設定するとします。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_TrackingNumber">
        <DisplayName>Assign_TrackingNumber</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>TrackingNumber</Name>
            <Value><![CDATA[<Code>560075393539898</Code>]]></Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    なお、<AssignVariable> によって設定される変数の型は string です。したがって、変数 TrackingNumber は string 型になります。

    TrackingNumber 変数は XML to JSON ポリシーの <Source> 要素で使われていることを思い出してください。

    <Source>TrackingNumber</Source>
    

    TrackingNumber は string 型であり、ポリシーに <OutputVariable> がないため、次のエラーコードを受け取ります。

    steps.xml2json.OutputVariableIsNotAvailable
    

解決策

XML to JSON ポリシーの <Source> 要素で指定されている変数の型が string である場合、<OutputVariable> 要素が必須であることにご注意ください。

上記で説明した XML to JSON ポリシーを修正するには、次のように <OutputVariable> 要素を含めます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
    <DisplayName>Convert-XMLToJSON</DisplayName>
    <Properties/>
    <Format>google</Format>
    <OutputVariable>response</OutputVariable>
    <Source>TrackingNumber</Source>
</XMLToJSON>

InCompatibleTypes

エラーコード

steps.xml2json.InCompatibleTypes

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: String can not be assigned to message type.",
        "detail": {
            "errorcode": "steps.xml2json.InCompatibleTypes"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "XMLToJSON[XMLToJSON_CheckType]: String can not be assigned to message type.",
        "detail": {
            "errorcode": "steps.xml2json.InCompatibleTypes"
        }
    }
}

原因

このエラーは、<Source> 要素で定義された変数の型と、<OutputVariable> 要素で定義された変数の型が異なる場合に発生します。<Source> 要素に含まれる変数の型と、<OutputVariable> 要素に含まれる変数の型が一致することは、必須です。

The valid types are message and string.

診断

  1. エラーが発生した XML to JSON ポリシーを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring では、ポリシー名は XMLToJSON_CheckType です。

    "faultstring": "XMLToJSON[XMLToJSON_CheckType]: String can not be assigned to message type."
    
  2. エラーが発生した XML to JSON ポリシーで、<OutputVariable> で指定された値を調べます。

    次の XML to JSON ポリシーの例には、<OutputVariable> 要素がありません。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="XMLToJSON_CheckType">
        <DisplayName>XMLToJSON_CheckType</DisplayName>
        <Properties/>
        <Format>google</Format>
        <OutputVariable>request</OutputVariable>
        <Source>TrackingNumber</Source>
    </XMLToJSON>
    
  3. <Source> 要素と <OutputVariable> 要素で指定された変数の型を特定します。

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

    たとえば、次のように Assign Message ポリシーを使用して TrackingNumber という変数に値を設定するとします。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_TrackingNumber">
        <DisplayName>Assign_TrackingNumber</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>TrackingNumber</Name>
            <Value><![CDATA[<Code>560075393539898</Code>]]></Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    なお、<AssignVariable> によって設定される変数の型は string です。したがって、変数 TrackingNumber は string 型になります。

    TrackingNumber 変数は XML to JSON ポリシーの <Source> 要素で使われていることを思い出してください。

    <Source>TrackingNumber</Source>
    

    同様に request 変数は XML to JSON ポリシーの <OutputVariable> 要素で使われていることを思い出してください。

    <OutputVariable>request</OutputVariable>
    

    TrackingNumber の型は string であるのに対し、response 変数の型は message で、これらは互換性がない型のため、次のエラーコードを受け取ります。

    steps.xml2json.InCompatibleTypes
    

    <Source> 要素に含まれる変数の型が message である一方、<OutputVariable> 要素に含まれる変数の型が string の場合も、上記のエラーが発生することがあります。

解決策

<Source> 要素と <OutputVariable> 要素で定義されている変数の型が常に同じであることを確認します。<Source> 要素に含まれる変数の型と、<OutputVariable> 要素に含まれる変数の型が一致することは、必須です。

上記の XML to JSON ポリシーを修正するには、Assign Message ポリシーを使用して string 型の別の変数 TrackingNumber_output を宣言し、XML to JSON ポリシーの <OutputVariable> 要素でこの変数を使用します。

変更された Assign Message ポリシー:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_TrackingNumber">
    <DisplayName>Assign_TrackingNumber</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name>TrackingNumber</Name>
        <Value><![CDATA[<Code>560098</Code>]]></Value>
        <Ref/>
    </AssignVariable>
    <AssignVariable>
        <Name>TrackingNumber_output</Name>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

変更後の XMLToJSON ポリシーは、次のようになります。

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <XMLToJSON async="false" continueOnError="false" enabled="true" name="XMLToJSON_CheckType">
      <DisplayName>XMLToJSON_CheckType</DisplayName>
      <Properties/>
      <Format>google</Format>
      <OutputVariable>TrackingNumber_output</OutputVariable>
      <Source>TrackingNumber</Source>
  </XMLToJSON>

InvalidSourceType

エラーコード

steps.xml2json.InvalidSourceType

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "XMLToJSON[class invalid_class]: Invalid source type class invalid_class. Valid source types are [message, string].",
        "detail": {
            "errorcode": "steps.xml2json.InvalidSourceType"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "XMLToJSON[class java.lang.Integer]: Invalid source type class java.lang.Integer. Valid source types are [message, string].",
        "detail": {
            "errorcode": "steps.xml2json.InvalidSourceType"
        }
    }
}

原因

このエラーは、<Source> 要素の定義に使用される変数の型が無効な場合に発生します。有効な変数の型は messagestring です。

診断

  1. XML to JSON ポリシーで使用されている無効な型の変数を特定します。この情報はエラー メッセージで確認できます。たとえば、次のエラーでは、無効な型は Integer です。

    "faultstring": "XMLToJSON[class java.lang.Integer]: Invalid source type class java.lang.Integer. Valid source types are [message, string]."
    
  2. エラーが発生した特定の API プロキシで、すべての XML to JSON ポリシーを調べます。エラーが発生した XML to JSON ポリシーで、<Source> で指定されている変数の名前を確認します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="XMLToJSON_CheckType">
        <DisplayName>XMLToJSON_CheckType</DisplayName>
        <Properties/>
        <Format>google</Format>
        <OutputVariable>response</OutputVariable>
        <Source>BookCode</Source>
    </XMLToJSON>
    
  3. 次のようにして <Source> 要素で指定された変数の型を特定します。

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

    たとえば、次のように ExtractVariables ポリシーを使用して、XML ペイロードから値を抽出し、integer 型の変数 BookCode にその値を設定するとします。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract_BookCode">
        <DisplayName>Extract_BookCode</DisplayName>
        <Properties/>
        <Source>request</Source>
        <XMLPayload stopPayloadProcessing="false">
            <Variable name="BookCode" type="integer">
                <XPath>/root/BookCode</XPath>
            </Variable>
        </XMLPayload>
    </ExtractVariables>
    

    BookCode 変数は XML to JSON ポリシーの <Source> 要素で使われていることを思い出してください。

    <Source>BookCode</Source>
    

    この変数の型は Integer です。これは有効な <Source> の型でないため、API プロキシは次のエラーで失敗します。

    steps.xml2json.InvalidSourceType
    

解決策

<Source> 要素の指定に使用されている変数の型が有効であることを確認します。有効な <Source> 型は messagestring です。

XML to JSON ポリシーで上記のエラーを回避するには、message 型の request 変数か、有効な XML ペイロードである他の文字列を使用します。