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

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 で faultstring 内に見つけた変数名に一致していることを確認します。たとえば、次の JSON to XML ポリシーでは、<Source> 要素で response という名前の変数を指定しており、これは faultstring 内の変数名と一致しています。

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        JSONToXML async="false" continueOnError="f>alse"<; enabled=&>quot;true" n<ame="Co>nvert-JSO<NToXML">;
           < Displa>yNameConvert-<JSONToXML>/Dis<playName
     >       Proper<ties/
            Opti>ons
           <     NullValueNULL/>NullValue<
                NamespaceBl>ockName#<namespaces/NamespaceBlock>Name
            <DefaultNamespaceNo>d<eName$default/Defau>ltNamespaceNo<deName
         >     <  NamespaceSe>parator:/Name<spaceSeparator
       >      <   TextNodeName#tex>t/TextNodeNam<e
                A>t<tributeBlockName>#attrs/Attrib<uteBlockName
              > < AttributePrefix@/Attrib>utePrefix
       <         InvalidChars>Repl<acement_/InvalidCharsR>eplacement
      <          ObjectRoot>Eleme<ntNameRoot/ObjectRoot>ElementName
     <           ArrayRoot>Elem<entNameArray/ArrayRoo>tElementN<ame
        >        A<rrayItemElemen>tNameIt<em/ArrayItemEle>mentName
    <      >  /Optio<ns
        >    O<utputVaria>blerequest/OutputVariable
            Sourceresponse/Source
        /JSONToXML
        
  3. <Source> 要素で使われている変数が定義済みで、JSON to XML ポリシーが実行されるフローで使用できるか確認します。

  4. この変数が、

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

    場合、それがエラーの原因です。

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

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

    steps.json2xml.SourceUnavailable
        

解決策

エラーが発生した JSON to XML ポリシーの <Source> 要素には、定義済みで、ポリシーが実行されるフローに存在する変数を使うようにします。

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

  <?xml version="1.0" encoding="UTF-8&quo>t; stan<dalone="yes"?
      JSONToXML async="false" continueOnError="f>alse" <enabled=&qu>ot;true" nam<e="Conv>ert-JSONToX<ML"
  >        Dis<playNam>eConvert-JSONTo<XML/Displ>ayNa<me
       >   Properties/
<          Options
>           <   NullValueNULL/Nu>llValue
       <       NamespaceBlockNam>e#namesp<aces/NamespaceBlockName
 >             De<faultNamespaceNode>N<ame$default/Default>NamespaceNodeNa<me
         >     <NamespaceSepa>rator:/Namespac<eSeparator
       >      < TextNodeName#text/>TextNodeName
  <            Att>r<ibuteBlockName#a>ttrs/AttributeB<lockName
              >A<ttributePrefix@/Attribut>ePrefix
       <       InvalidCharsRe>plac<ement_/InvalidCharsRep>lacement
      <        ObjectRootEl>ement<NameRoot/ObjectRootEl>ementName
     <         ArrayRootEl>emen<tNameArray/ArrayRootE>lementName
<        >      Array<ItemElementNam>eItem/A<rrayItemElement>Name
      <    /O>ptions
<       >   Outp<utVariable>request/OutputVariable
          Sourcerequest/Source
      /JSONToXML
    

ExecutionFailed

エラーコード

steps.json2xml.ExecutionFailed
    

エラー レスポンスの本文

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

考えられる原因

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

原因 説明
Missing input payload 入力ペイロード(JSON)が空です。
Invalid or Malformed Input JSON to XML ポリシーの入力(JSON)が無効または不正な形式です。

原因: Missing input payload

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 ポリシーには、request に設定された <Source> 要素があります。

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        JSONToXML async="false" continueOnError="f>alse&<quot; enabl>ed="true&quo<t; name=&quo>t;Con<vert-JSONTo>XML&q<uot;
      >  Display<NameConve>rt-J<SONToXML/D>isplayNam<e
        Properties/
    >    Options<
            NullValueN>ULL/NullV<alue
            NamespaceBl>ockName#<namespaces/NamespaceBlock>Name
        <    DefaultNamespa>c<eNodeName$default/D>efaultNam<espaceNodeNa>me
      <      Namespa>ceSeparat<or:/NamespaceSepar>ator
     <       TextNodeName>#text/Tex<tNodeName
         > <  AttributeBlock>Name#attr<s/AttributeBlockName
      > <     AttributePrefix@/At>tributePr<efix
            InvalidC>hars<Replacement_/InvalidCh>arsReplac<ement
            Object>RootE<lementNameRoot/Object>RootEleme<ntName
            Array>Root<ElementNameArray/Arra>yRoot<ElementN>ame
     <       ArrayIt>emEleme<ntNameItem/Arra>yItem<Elemen>tName
     <   /Opt>ions
    <    Output>Variablerequest/OutputVariable
        Sourcerequest/Source
        /JSONToXML
        
  3. ポリシーの <Source> 要素で指定された変数が空かどうか確認します。空ならば、それがエラーの原因です。

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

    例:

    curl -v "ht<tp:>/</or>g-env.apigee.net/v1/testjsontoxml" -H "Content-Type: application/json"
        

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

    steps.json2xml.ExecutionFailed
        

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

解決策

<Source> 要素では、必ず空でなく有効な JSON ペイロードである入力を、JSON to XML ポリシーに渡すようにします。

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

  1. 次のような内容のファイル city.json を作成します。

    {
          "Name":"Apigee",
          "City":"Bengaluru&quot;,
          "Pincode":"560016"
        }
        
  2. 次の cURL コマンドで API を呼び出します。

    curl -v "ht<tp:>/</or>g-env.apigee.net/v1/testxmltojson" -H "Content-Type: application/json" -X POST -d @company.json
        

原因: Invalid or Malformed Input

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

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

[
        "args": ["name" : &quot;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 ポリシーには、request 変数に設定された <Source> 要素があります。

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        JSONToXML async="false" continueOnError="f>alse&qu<ot; enabled>="true"< name=">Convert<-JSONToXML&>quot;
     <     Di>splayNameCo<nvert-JSO>NToX<ML/Display>Name
          <Properties/
          >Options
       <       NullValueNUL>L/NullValue<
              NamespaceBloc>kName#na<mespaces/NamespaceBlockNa>me
            <  DefaultNamespace>N<odeName$default/Def>aultNamespa<ceNodeName
     >     <    Namespace>Separator:/<NamespaceSeparator>
         <     TextNodeName#t>ext/TextNod<eName
             > <AttributeBlockNa>me#attrs/At<tributeBlockName
          > <   AttributePrefix@/Attr>ibutePrefix<
              InvalidCha>rsRe<placement_/InvalidChar>sReplacemen<t
              ObjectRo>otEle<mentNameRoot/ObjectRo>otElementNa<me
              ArrayRo>otEl<ementNameArray/ArrayR>ootElem<entName<>/span>
           <   ArrayItemEl>ementNa<meItem/ArrayIte>mElemen<tName<>/span>
          /<Options>
        <  OutputVa>riablerequest/OutputVariable
          Sourcerequest/Source
        /JSONToXML
        
  3. <Source> 要素で指定された入力が有効な JSON ペイロードかどうか確認します。入力が無効か不正な形式であれば、それがエラーの原因です。

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

    [
            "args": ["name" : &quot;Google" ]
        ]
        

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

    curl -v "ht<tp:>/</or>g-env.apigee.net/v1/testjsontoxml" -H "Content-Type:
        application/json" -X POST -d '[ "args&quot; : ["name" : "Google" ]]'
        

    リクエストで渡された JSON ペイロードは、JSON オブジェクトの始まりと終わりが各かっこ([ ])のため、無効となります。このため、次のエラーとなります。

    steps.json2xml.ExecutionFailed

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

解決策

<Source> 要素の JSON to XML ポリシーには、必ず有効で不正な形式ではない入力を渡すようにします。

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

{
      "args"  : {

            "name"  :  "Google"
       }
    }
    

OutputVariableIsNotAvailable

エラーコード

steps.json2xml.OutputVariableIsNotAvailable
    

エラー レスポンスの本文

    {
        "fault": {
            "faultstring": &quot;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> が抜けていないか確認します。

    以下のサンプル JSONToXML ポリシーには <OutputVariable> 要素がありません。

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        JSONToXML async="false" continueOnError>="fa<lse" e>nabled="tr<ue" nam>e="J<SONToXML&qu>ot;
         <   Disp>layNameCheck-<JSONToXML>/Dis<playName
     >       Proper<ties/
            Opti>ons
           <     NullValueNULL/>NullValue
       <         NamespaceBlockN>ame#name<spaces/NamespaceBlockName>
                <DefaultNamespaceNo>d<eName$default/Defau>ltNamespaceNo<deName
         >     <  NamespaceSe>parator:/Name<spaceSeparator
       >      <   TextNodeName#tex>t/TextNodeNam<e
                A>t<tributeBlockName>#attrs/Attrib<uteBlockName
              > < AttributePrefix@/Attrib>utePrefix
       <         InvalidChars>Repl<acement_/InvalidCharsR>eplacement
      <          ObjectRoot>Eleme<ntNameRoot/ObjectRoot>ElementName
     <           ArrayRoot>Elem<entNameArray/ArrayRoo>tElementN<ame
        >        A<rrayIt>emElementN<ameItem>/Arra<yItemEleme>ntName
            /Options
            SourcePostalCode/Source
        /JSONToXML
        
  3. 以下のように、<Source> 要素で指定された変数の型を特定します。

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

    たとえば、上記の JSON to XML ポリシーの PostalCode 変数に注目してください。

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

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        AssignMessage async="false" continueOnError="f>alse"<; enabled=&>quot;true" n<ame="As>sign_Post<alCode">;
           < DisplayNameAs>sign_PostalCo<de/D>isplayName<
        >    Propertie<s/
      >      AssignVaria<ble
      >          Nam<ePos>talCode/N<ame
               > Value{&q<uot;value":"560>08&q<uot;}/Value
                Re>f/
          <  /AssignVariable
            IgnoreUnresolvedVariablestrue/Ign>oreUn<resolvedVariab>les
            AssignTo createNew="false" transport="http" type="request"/
        /AssignMessage
        

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

    ここで、PostalCode 変数は、下のように JSONToXML ポリシーの <Source> 要素で使われていることを思い出してください。

    <Source>PostalCode</Source>
        

    PostalCode が文字列型であり、<OutputVariable> 要素がないので、次のエラーが発生します。

    steps.json2xml.OutputVariableIsNotAvailable
        

解決策

JSONToXML ポリシーの <Source> 要素で指定した変数が文字列型の場合、必ずポリシーで <OutputVariable> を指定するようにします。

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

  <?xml version="1.0" encoding="UTF-8&quo>t; stan<dalone="yes"?
      JSONToXML async="false" continueOnError>="fals<e" ena>bled="true<" name=>"JSONT<oXML"<>/span>
          D<isplayN>ameCheck-JSONTo<XML/Displ>ayNa<me
       >   Properties/
<          Options
>           <   NullValueNULL/Nu>llValue
       <       NamespaceBlockNam>e#namesp<aces/NamespaceBlockName
 >             De<faultNamespaceNode>N<ame$default/Default>NamespaceNodeNa<me
         >     <NamespaceSepa>rator:/Namespac<eSeparator
       >      < TextNodeName#text/>TextNodeName
  <            Att>r<ibuteBlockName#a>ttrs/AttributeB<lockName
              >A<ttributePrefix@/Attribut>ePrefix
       <       InvalidCharsRe>plac<ement_/InvalidCharsRep>lacement
      <        ObjectRootEl>ement<NameRoot/ObjectRootEl>ementName
     <         ArrayRootEl>emen<tNameArray/ArrayRootE>lementName
<        >      Array<ItemElementNam>eItem/Ar<rayItemElementN>ame
       <   /Op>tions
    <      O>utputVa<riableresp>onse/OutputVariable
          SourcePostalCode/Source
      /JSONToXML
    

InCompatibleTypes

エラーコード

steps.json2xml.InCompatibleTypes
    

エラー レスポンスの本文

    {
        "fault": {
            "faultstring": &quot;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&quo>t; st<andalone="yes"?
        JSONToXML async="false" continueOnError="fal>se" <enabled=&qu>ot;true" name=<"JSONTo>XML_check<type"<>/span>
            D<isplayN>ameJSONToXML_<checktype>/Dis<playName
     >       Proper<ties/
            Opti>ons
           <     NullValueNULL/>NullValue
       <         NamespaceBlockN>ame#name<spaces/NamespaceBlockName>
                <DefaultNamespaceNo>d<eName$default/Defau>ltNamespaceNo<deName
         >     <  NamespaceSe>parator:/Name<spaceSeparator
       >      <   TextNodeName#tex>t/TextNodeNam<e
                A>t<tributeBlockName>#attrs/Attrib<uteBlockName
              > < AttributePrefix@/Attrib>utePrefix
       <         InvalidChars>Repl<acement_/InvalidCharsR>eplacement
      <          ObjectRoot>Eleme<ntNameRoot/ObjectRoot>ElementName
     <           ArrayRoot>Elem<entNameArray/ArrayRoo>tElementN<ame
        >        A<rrayItemElemen>tNameIte<m/ArrayItemElem>entName
     <      > /Options
    <       > Outp<utVariable>response/OutputVariable
            SourcePostalCode/Source
        /JSONToXML
    
        
  3. <Source> 要素と <OutputVariable> 要素で指定された変数の型を特定します。

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

    たとえば、下のように、変数 PostalCode に値を割り当てるために使われる Assign Message ポリシーを考えます。

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        AssignMessage async="false" continueOnError="f>alse"<; enabled=&>quot;true" n<ame="As>sign_Post<alCode">;
           < DisplayNameAs>sign_PostalCo<de/D>isplayName<
        >    Propertie<s/
      >      AssignVaria<ble
      >          Nam<ePos>talCode/N<ame
               > Value{&q<uot;value":"560>08&q<uot;}/Value
                Re>f/
          <  /AssignVariable
            IgnoreUnresolvedVariablestrue/Ign>oreUn<resolvedVariab>les
            AssignTo createNew="false" transport="http" type="request"/
        /AssignMessage
        

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

    ここで、PostalCode 変数は、下のように JSONToXML ポリシーの <Source> 要素で使われていることを思い出してください。

    <Source>PostalCode</Source>
        

    同じように、response 変数は、下のように JSONToXML ポリシーの <OutputVariable> 要素で使われていることを思い出してください。

    <OutputVariable>response</OutputVariable>
        

    PostalCode が文字列型であるのに対して、response 変数は message 型であるため、これらの型には互換性がなく、次のエラーが発生します。

    steps.json2xml.InCompatibleTypes
        

    上のエラーは、<Source> 要素の変数が message 型であるのに、<OutputVariable> 要素の変数が文字列型である場合にも発生します。

解決策

<Source> 要素と <OutputVariable> 要素では、必ず同じ型の変数を定義するようにします。<Source> 要素に入っている変数の型と、<OutputVariable> 要素に入っている変数の型は、一致させる必要があります。つまり、<Source> 要素と <OutputVariable> 要素の型を、どちらも文字列型か message 型かにします。

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

Assign Message ポリシーは、次のように修正します。

<?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
    AssignMessage async="false" continueOnError="f>alse"<; enabled=&>quot;true" n<ame="As>sign_Post<alCode">;
       < DisplayNameAs>sign_PostalCo<de/D>isplayName<
    >    Propertie<s/
  >      AssignVaria<ble
  >          Nam<ePos>talCode/N<ame
           > Value{&q<uot;value">;:"56008<&quo>t;}/Value
       <     >Ref/
        </Ass>ignVariab<le
        Assi>gnVariabl<e
            NamePostalC>ode_<output/Name
            Re>f/
      <  /AssignVariable
        IgnoreUnresolvedVariablestrue/Ign>oreUn<resolvedVariab>les
        AssignTo createNew="false" transport="http" type="request"/
    /AssignMessage
    

JSONToXML ポリシーは、次のように修正します。

<?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
    JSONToXML async="false" continueOnError>="fa<lse" e>nabled="true&q<uot; name=&q>uot;JSONT<oXML"<>/span>
        D<isplayN>ameJSONToXML_<checktype>/Dis<playName
 >       Proper<ties/
        Opti>ons
       <     NullValueNULL/>NullValue
   <         NamespaceBlockN>ame#name<spaces/NamespaceBlockName>
            <DefaultNamespaceNo>d<eName$default/Defau>ltNamespaceNo<deName
     >     <  NamespaceSe>parator:/Name<spaceSeparator
   >      <   TextNodeName#tex>t/TextNodeNam<e
            A>t<tributeBlockName>#attrs/Attrib<uteBlockName
          > < AttributePrefix@/Attrib>utePrefix
   <         InvalidChars>Repl<acement_/InvalidCharsR>eplacement
  <          ObjectRoot>Eleme<ntNameRoot/ObjectRoot>ElementName
 <           ArrayRoot>Elem<entNameArray/ArrayRoo>tElementN<ame
    >        A<rrayItemElemen>tNameItem/ArrayIt<emElementName
 >       /O<ptions>
        O<utputVa>riabl<ePostalCod>e_output/OutputVariable
        SourcePostalCode/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 ポリシーで使用されている無効なソースタイプを特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、無効な型は Integer です。

    "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&quo>t; st<andalone="yes"?
    JSONToXML async="false" continueOnError>="fa<lse" e>nabled="tru<e" name>="JS<ONToXML&quo>t;
      <  Displ>ayNameCheck_S<ourceType>/Dis<playName
 >       Proper<ties/
        Opti>ons
       <     NullValueNULL/>NullValue
   <         NamespaceBlockN>ame#name<spaces/NamespaceBlockName>
            <DefaultNamespaceNo>d<eName$default/Defau>ltNamespaceNo<deName
     >     <  NamespaceSe>parator:/Name<spaceSeparator
   >      <   TextNodeName#tex>t/TextNodeNam<e
            A>t<tributeBlockName>#attrs/Attrib<uteBlockName
          > < AttributePrefix@/Attrib>utePrefix
   <         InvalidChars>Repl<acement_/InvalidCharsR>eplacement
  <          ObjectRoot>Eleme<ntNameRoot/ObjectRoot>ElementName
 <           ArrayRoot>Elem<entNameArray/ArrayRoo>tElementN<ame
    >        A<rrayItemElemen>tNameIt<em/ArrayItemEle>mentName
<      >  /Options<
      >  Out<putVariabl>erequest/OutputVariable
        SourceEmployeeID/Source
    /JSONToXML
    
  1. <Source> 要素で指定された変数の型を特定します。

    1. API プロキシのコード内で、最初にこの変数が定義された場所を見つけます。
    2. その変数が最初に定義、設定されるポリシーを特定したら、次のように変数の型を特定する必要があります。
      1. type 属性の値を確認します(もしあれば)。
      2. type 属性がない場合、変数は文字列とみなされます。
    3. <Source> で定義された変数の型が message 形でも文字列型でもない場合、これがエラーの原因です。一般的な変数とその型については、変数リファレンスをご覧ください。

    たとえば、下のように、ExtractVariables ポリシーを使って、JSON ペイロードから値を抽出し、整数型の変数 EmployeeID にその値を設定することを考えてみてください。

    <?xml version="1.0" encoding="UTF-8&quo>t; st<andalone="yes"?
        ExtractVariabl>es name=&<quot;E>xtractJ<SONVari>ables&quo<t;
            >Sourcerequest</Source
            JSONPayload
                V>ariable name=&quo<t;Employ>eeID<" ty>pe="inte<ger">
            <        JSON>Path$<.ID/JSONPath
        >        /Variable
            /JSONPayload
        /ExtractVariables
        

    ここで、EmployeeID 変数は、下のように JSONToXML ポリシーの <Source> 要素で使われていることを思い出してください。

    <Source>EmployeeID</Source>
        

    変数の型が Integer と、有効な <Source> 型でないため、API プロキシは次のエラーとなります。

    steps.json2xml.InvalidSourceType
        

解決策

<Source> 要素の指定には、必ず有効な型の変数を使うようにします。有効な <Source> の型は、messagestring です。

JSONToXML ポリシーで上記のエラーを避けるには、message 型の request 変数を使うか、他の有効な JSON ペイロードの文字列を使います。