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

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
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> 要素に指定された message 変数または string 変数が次のいずれかの状態である場合に発生します。

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

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

診断

  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 ポリシーの例を修正するには、<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/>
    <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> 要素が 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. XML to JSON ポリシーの <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 ポリシーが無効または不正な形式の入力を解析すると、このエラーが発生します。

たとえば、次の無効な XML が入力として 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>
    

    TrackingNumberstring 型であるのに対し、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>

変更された XML to JSON ポリシー:

  <?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 ポリシーで使用されている無効な source 型を特定します。この情報はエラー メッセージで確認できます。たとえば、次のエラーの無効な型は 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 ペイロードの他の文字列を使用します。