JSON to XML ポリシーの実行時エラーの解決方法

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

SourceUnavailable

エラーコード

steps.json2xml.SourceUnavailable

エラー レスポンスの本文

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

エラーの例

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

原因

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

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

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

診断

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

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

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
        <DisplayName>Convert-JSONToXML</DisplayName>
        <Properties/>
        <Options>
            <NullValue>NULL</NullValue>
            <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
            <NamespaceSeparator>:</NamespaceSeparator>
            <TextNodeName>#text</TextNodeName>
            <AttributeBlockName>#attrs</AttributeBlockName>
            <AttributePrefix>@</AttributePrefix>
            <InvalidCharsReplacement>_</InvalidCharsReplacement>
            <ObjectRootElementName>Root</ObjectRootElementName>
            <ArrayRootElementName>Array</ArrayRootElementName>
            <ArrayItemElementName>Item</ArrayItemElementName>
        </Options>
        <OutputVariable>request</OutputVariable>
        <Source>response</Source>
    </JSONToXML>
    
  3. <Source> 要素で使われている変数が定義されていて、JSON to XML ポリシーが実行されるフローで使用できることを確認します。

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

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

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

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

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

    steps.json2xml.SourceUnavailable
    

解決策

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

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

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
      <DisplayName>Convert-JSONToXML</DisplayName>
      <Properties/>
      <Options>
          <NullValue>NULL</NullValue>
          <NamespaceBlockName>#namespaces</NamespaceBlockName>
          <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
          <NamespaceSeparator>:</NamespaceSeparator>
          <TextNodeName>#text</TextNodeName>
          <AttributeBlockName>#attrs</AttributeBlockName>
          <AttributePrefix>@</AttributePrefix>
          <InvalidCharsReplacement>_</InvalidCharsReplacement>
          <ObjectRootElementName>Root</ObjectRootElementName>
          <ArrayRootElementName>Array</ArrayRootElementName>
          <ArrayItemElementName>Item</ArrayItemElementName>
      </Options>
      <OutputVariable>request</OutputVariable>
      <Source>request</Source>
  </JSONToXML>

ExecutionFailed

エラーコード

steps.json2xml.ExecutionFailed

エラー レスポンスの本文

{
   "fault": {
        "faultstring": "JSONToXML[policy_name]: Execution failed due to reason: Expecting { or [ at line 1",
        "detail": {
            "errorcode": "steps.json2xml.ExecutionFailed"
        }
    }
}

考えられる原因

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

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

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

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

たとえば、JSON to XML ポリシーの <Source> 要素が request または response 変数として設定されていて、JSON ペイロードが含まれるものの、ペイロードが空の場合、エラーが発生します。

診断

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

    "faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"
    
  2. エラーが発生した JSON to XML ポリシーの XML で <Source> 要素を確認し、指定された変数を判断します。たとえば、次の JSON to XML ポリシーでは、<Source> 要素が request に設定されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
    <DisplayName>Convert-JSONToXML</DisplayName>
    <Properties/>
    <Options>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <TextNodeName>#text</TextNodeName>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
    </Options>
    <OutputVariable>request</OutputVariable>
    <Source>request</Source>
    </JSONToXML>
    
  3. ポリシーの <Source> 要素に指定された変数が空かどうか確認します。要素が空の場合は、それがエラーの原因です。

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

    次に例を示します。

    curl -v "http://your_host_alias/v1/testjsontoxml" -H "Content-Type: application/json"
    

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

    JSON レスポンスのペイロードが空のため、次のエラーコードを受け取ります。

    steps.json2xml.ExecutionFailed
    

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

解決策

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

サンプル JSON to XML ポリシーの問題を解決するには、有効な JSON ペイロードを渡します。次に例を示します。

  1. 次の内容のファイルを city.json という名前で作成します。

    {
      "Name":"Apigee",
      "City":"Bengaluru",
      "Pincode":"560016"
    }
    
  2. 次の curl コマンドを使用して、API 呼び出しを行います。

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

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

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

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

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

[
    "args": ["name" : "Google" ]
]

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

"faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"

診断

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

    "faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"
    
  2. 失敗した JSON to XML ポリシーの XML で指定されている <Source> 要素を調べます。たとえば、次の JSON to XML ポリシーでは、<Source> 要素が request 変数に設定されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
      <DisplayName>Convert-JSONToXML</DisplayName>
      <Properties/>
      <Options>
          <NullValue>NULL</NullValue>
          <NamespaceBlockName>#namespaces</NamespaceBlockName>
          <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
          <NamespaceSeparator>:</NamespaceSeparator>
          <TextNodeName>#text</TextNodeName>
          <AttributeBlockName>#attrs</AttributeBlockName>
          <AttributePrefix>@</AttributePrefix>
          <InvalidCharsReplacement>_</InvalidCharsReplacement>
          <ObjectRootElementName>Root</ObjectRootElementName>
          <ArrayRootElementName>Array</ArrayRootElementName>
          <ArrayItemElementName>Item</ArrayItemElementName>
      </Options>
      <OutputVariable>request</OutputVariable>
      <Source>request</Source>
    </JSONToXML>
    
  3. <Source> 要素で指定された入力が有効な JSON ペイロードであるかどうかを検証します。入力が無効か不正な形式である場合、それがエラーの原因です。

    次の無効な JSON がポリシーに渡されたとします。

    [
        "args": ["name" : "Google" ]
    ]
    

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

    curl -v "http://your_host_alias/v1/testjsontoxml" -H "Content-Type:
    application/json" -X POST -d '[ "args" : ["name" : "Google" ]]'
    

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

    リクエストで渡された JSON ペイロードは、角かっこ([ ])で囲まれているため、無効です。このため、次のエラーコードを受け取ります。

    steps.json2xml.ExecutionFailed

    このエラーは、<Source> 要素がレスポンスに設定されているにもかかわらず、JSON レスポンスのペイロードが無効あるいは不正な形式な場合にも発生します。

解決策

<Source> 要素の JSON to XML ポリシーに渡された入力が、有効で、不正な形式であることを確認してください。

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

{
  "args"  : {

        "name"  :  "Google"
   }
}

OutputVariableIsNotAvailable

エラーコード

steps.json2xml.OutputVariableIsNotAvailable

エラー レスポンスの本文

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

エラーの例

{
    "fault": {
        "faultstring": "JSONToXML[Check-JSONToXML]: Output variable is not available.",
        "detail": {
            "errorcode": "steps.json2xml.OutputVariableIsNotAvailable"
        }
    }
}

原因

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

診断

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

    "faultstring": "JSONToXML[Check-JSONToXML]: Output variable is not available."
    
  2. エラーが発生した JSON to XML ポリシーで、<OutputVariable> が欠落しているか確認します。

    次のサンプル JSON to XML ポリシーには <OutputVariable> 要素がありません。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
        <DisplayName>Check-JSONToXML</DisplayName>
        <Properties/>
        <Options>
            <NullValue>NULL</NullValue>
            <NamespaceBlockName>#namespaces</NamespaceBlockName>
            <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
            <NamespaceSeparator>:</NamespaceSeparator>
            <TextNodeName>#text</TextNodeName>
            <AttributeBlockName>#attrs</AttributeBlockName>
            <AttributePrefix>@</AttributePrefix>
            <InvalidCharsReplacement>_</InvalidCharsReplacement>
            <ObjectRootElementName>Root</ObjectRootElementName>
            <ArrayRootElementName>Array</ArrayRootElementName>
            <ArrayItemElementName>Item</ArrayItemElementName>
        </Options>
        <Source>PostalCode</Source>
    </JSONToXML>
    
  3. 次のようにして <Source> 要素で指定された変数の型を特定します。

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

    たとえば、上記の JSON to XML ポリシーの PostalCode 変数を確認します。

    たとえば、以下のように Assign Message ポリシーを使用して、PostalCode という名前の変数に値を割り当てるとします。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_PostalCode">
        <DisplayName>Assign_PostalCode</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>PostalCode</Name>
            <Value>{"value":"56008"}</Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

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

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

    <Source>PostalCode</Source>
    

    PostalCode が文字列型で、<OutputVariable> 要素が指定されていないため、次のエラーコードを受け取ります。

    steps.json2xml.OutputVariableIsNotAvailable
    

解決策

JSON to XML ポリシーの <Source> 要素で指定された変数が文字列型の場合、ポリシー内に <OutputVariable> 要素を定義します。

上記の JSON to XML ポリシーを修正するには、次のように <OutputVariable> 要素を追加します。

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
      <DisplayName>Check-JSONToXML</DisplayName>
      <Properties/>
      <Options>
          <NullValue>NULL</NullValue>
          <NamespaceBlockName>#namespaces</NamespaceBlockName>
          <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
          <NamespaceSeparator>:</NamespaceSeparator>
          <TextNodeName>#text</TextNodeName>
          <AttributeBlockName>#attrs</AttributeBlockName>
          <AttributePrefix>@</AttributePrefix>
          <InvalidCharsReplacement>_</InvalidCharsReplacement>
          <ObjectRootElementName>Root</ObjectRootElementName>
          <ArrayRootElementName>Array</ArrayRootElementName>
          <ArrayItemElementName>Item</ArrayItemElementName>
      </Options>
      <OutputVariable>response</OutputVariable>
      <Source>PostalCode</Source>
  </JSONToXML>

InCompatibleTypes

エラーコード

steps.json2xml.InCompatibleTypes

エラー レスポンスの本文

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

エラーの例

{
    "fault": {
        "faultstring": "JSONToXML[JSONToXML_checktype]: String can not be assigned to message type.",
        "detail": {
            "errorcode": "steps.json2xml.InCompatibleTypes"
        }
    }
}

原因

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

有効な型は messagestring です。

診断

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

    "faultstring": "JSONToXML[JSONToXML_checktype]: String can not be assigned to message type."
    
  2. エラーが発生した JSON to XML ポリシーで、<OutputVariable><Source> の値を確認します。

    次のポリシーについて考えてみましょう。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML_checktype">
        <DisplayName>JSONToXML_checktype</DisplayName>
        <Properties/>
        <Options>
            <NullValue>NULL</NullValue>
            <NamespaceBlockName>#namespaces</NamespaceBlockName>
            <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
            <NamespaceSeparator>:</NamespaceSeparator>
            <TextNodeName>#text</TextNodeName>
            <AttributeBlockName>#attrs</AttributeBlockName>
            <AttributePrefix>@</AttributePrefix>
            <InvalidCharsReplacement>_</InvalidCharsReplacement>
            <ObjectRootElementName>Root</ObjectRootElementName>
            <ArrayRootElementName>Array</ArrayRootElementName>
            <ArrayItemElementName>Item</ArrayItemElementName>
        </Options>
        <OutputVariable>response</OutputVariable>
        <Source>PostalCode</Source>
    </JSONToXML>
    
  3. <Source> 要素と <OutputVariable> 要素で指定された変数の型を特定します。

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

    たとえば、以下のように、PostalCode という名前の変数に値を割り当てるために使用される Assign Message ポリシーについて考えてみましょう。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_PostalCode">
        <DisplayName>Assign_PostalCode</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>PostalCode</Name>
            <Value>{"value":"56008"}</Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    <AssignVariable> で設定されている変数の型は文字列です。したがって、変数 PostalCode は文字列型になります。

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

    <Source>PostalCode</Source>
    

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

    <OutputVariable>response</OutputVariable>
    

    PostalCode は文字列型ですが、response 変数はメッセージ型です。これらは互換性のない型のため、次のエラーコードを受け取ります。

    steps.json2xml.InCompatibleTypes
    

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

解決策

<Source> 要素と <OutputVariable> 要素で定義されている変数の型が常に同じであることを確認します。<Source> 要素に含まれる変数の型と <OutputVariable> 要素に含まれる変数の型は一致している必要があります。つまり、<Source> 要素と <OutputVariable> 要素の両方が文字列型かメッセージ型であることを確認します。

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

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_PostalCode">
    <DisplayName>Assign_PostalCode</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Value>{"value":"56008"}</Value>
        <Ref/>
    </AssignVariable>
    <AssignVariable>
        <Name>PostalCode_output</Name>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

修正された JSON To XML ポリシー:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
    <DisplayName>JSONToXML_checktype</DisplayName>
    <Properties/>
    <Options>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <TextNodeName>#text</TextNodeName>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
    </Options>
    <OutputVariable>PostalCode_output</OutputVariable>
    <Source>PostalCode</Source>
</JSONToXML>

InvalidSourceType

エラーコード

steps.json2xml.InvalidSourceType

エラー レスポンスの本文

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

エラーの例

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

原因

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

診断

  1. JSON to XML ポリシーで使用されている無効なソースタイプを特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、無効な型は整数です。

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

    <Source> 要素内で EmployeeID という名前の変数が指定されているポリシーの例を次に示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
    <DisplayName>Check_SourceType</DisplayName>
    <Properties/>
    <Options>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <TextNodeName>#text</TextNodeName>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
    </Options>
    <OutputVariable>request</OutputVariable>
    <Source>EmployeeID</Source>
</JSONToXML>
  1. 次のようにして <Source> 要素で指定された変数の型を特定します。

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

    たとえば、以下に示すように ExtractVariables ポリシーを使用して、JSON ペイロードから値を抽出し、整数型の変数 EmployeeID に設定してみます。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>request</Source>
        <JSONPayload>
            <Variable name="EmployeeID" type="integer">
                <JSONPath>$.ID</JSONPath>
            </Variable>
        </JSONPayload>
    </ExtractVariables>
    

    EmployeeID 変数は JSON to XML ポリシーの <Source> 要素で使われていることに注意してください。

    <Source>EmployeeID</Source>
    

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

    steps.json2xml.InvalidSourceType
    

解決策

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

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