פתרון בעיות של שגיאות זמן ריצה במדיניות JSON ל-XML

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

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"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם המשתנה message שצוין ברכיב <Source> של מדיניות JSON ל-XML הוא אחד מהבאים:

  • לא רלוונטי (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
  • לא ניתן לפתור (לא מוגדר)

לדוגמה, השגיאה הזו מתרחשת אם מדיניות JSON ל-XML אמורה להתבצע בתהליך בקשת הנתונים, אבל הרכיב <Source> מוגדר למשתנה response, שלא קיים בתהליך בקשת הנתונים.

אבחון

  1. מזהים את מדיניות ה-JSON ל-XML שבה אירעה השגיאה ואת שם המשתנה שלא זמין. אפשר למצוא את שני הפריטים האלה ברכיב faultstring של תגובת השגיאה. לדוגמה, ב-faultstring הבא, שם המדיניות הוא Convert-JSONToXML והמשתנה הוא response:

    "faultstring": "JSONToXML[Convert-JSONToXML]: Source response is not available"
    
  2. ב-XML של המדיניות שנכשלה מ-JSON ל-XML, מוודאים שהשם של המשתנה שהוגדר ברכיב <Source> זהה לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, במדיניות הבאה מ-JSON ל-XML מוגדר משתנה בשם response ברכיב <Source>, שתואם למה שמוגדר ברכיב 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 ל-XML.

  4. אם המשתנה הוא:

    • לא רלוונטי (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
    • לא ניתן לפתור (לא מוגדר)

    אז זו הסיבה לשגיאה.

    לדוגמה, נניח שמדיניות ה-JSON ל-XML שמוצגת למעלה אמורה לפעול בתהליך הבקשה. כזכור, המשתנה response משמש ברכיב <Source> של מדיניות JSON ל-XML. משתנה התגובה זמין רק בתהליך התגובה.

    מכיוון שהמשתנה response לא קיים בתהליך הבקשה, מוצג קוד השגיאה:

    steps.json2xml.SourceUnavailable
    

רזולוציה

מוודאים שהמשתנה שהוגדר ברכיב <Source> של מדיניות JSON ל-XML שנכשלה מוגדר וקיים בתהליך שבו המדיניות מופעלת.

כדי לתקן את מדיניות ה-JSON לדוגמה שמוצגת למעלה, אפשר לשנות את הרכיב <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>

ExecutionFailed

קוד שגיאה

steps.json2xml.ExecutionFailed

גוף התגובה לשגיאה

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

גורמים אפשריים

הסיבות האפשריות לשגיאה הזו:

הסיבה תיאור
מטען ייעודי (payload) של קלט חסר המטען הייעודי (payload) של הקלט (JSON) ריק.
קלט לא תקין או פגום הקלט (JSON) שהועבר למדיניות JSON to XML לא תקין או שהפורמט שלו שגוי.

הסיבה: חסר מטען קלט

השגיאה הזו מתרחשת במדיניות JSON ל-XML אם התוכן (המטען הייעודי) של המשתנה שצוין ברכיב <Source> ריק.

לדוגמה, אם הרכיב <Source> במדיניות JSON ל-XML מוגדר כמשתנה request או response, והוא אמור להכיל מטען ייעודי (payload) של JSON, אבל המטען הייעודי ריק, השגיאה מתרחשת.

אבחון

  1. מזהים את המדיניות של JSON ל-XML שבה התרחשה השגיאה. אפשר למצוא את המידע הזה באלמנט faultstring של תגובת השגיאה. לדוגמה, בשורה faultstring הבאה, שם המדיניות הוא Convert-JSONToXML:

    "faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"
    
  2. בודקים את הרכיב <Source> ב-XML של המדיניות שנכשלה מ-JSON ל-XML ומזהים את המשתנה שצוין. לדוגמה, במדיניות הבאה מ-JSON ל-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 ל-XML שמוצגת למעלה, מטען הבקשה (כלומר, גוף הבקשה) שנשלח על ידי הלקוח ריק.

    לדוגמה:

    curl -v "http://<org>-<env>.apigee.net/v1/testjsontoxml" -H "Content-Type: application/json"
    

    מכיוון שהמטען הייעודי (payload) של תגובת ה-JSON ריק, מתקבל קוד השגיאה:

    steps.json2xml.ExecutionFailed
    

    השגיאה הזו יכולה להופיע גם אם רכיב <Source> מוגדר לתגובה, אבל שרת הקצה העורפי מעביר מטען ייעודי ריק.

רזולוציה

מוודאים שהקלט שמועבר למדיניות JSON ל-XML ברכיב <Source> הוא מטען ייעודי (payload) תקין של JSON ולא ריק.

כדי לפתור את הבעיה במדיניות לדוגמה של JSON ל-XML, צריך להעביר מטען ייעודי (payload) תקין של JSON. לדוגמה:

  1. יוצרים קובץ בשם city.json עם התוכן הבא:

    {
      "Name":"Apigee",
      "City":"Bengaluru",
      "Pincode":"560016"
    }
    
  2. מבצעים את הקריאה ל-API באמצעות פקודת cURL באופן הבא:

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

הגורם: קלט לא תקין או לא מעוצב

השגיאה הזו מתרחשת אם המדיניות JSON to XML מנתחת קלט לא תקין או פגום.

לדוגמה, אם קובץ ה-JSON הלא תקין הבא מסופק כקלט למדיניות JSON ל-XML,

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

תוצג השגיאה:

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

אבחון

  1. מזהים את המדיניות של JSON ל-XML שבה התרחשה השגיאה. אפשר למצוא את המידע הזה באלמנט faultstring של תגובת השגיאה. לדוגמה, בשורה faultstring הבאה, שם המדיניות הוא Convert-JSONToXML:

    "faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"
    
  2. בודקים את רכיב <Source> שצוין במדיניות ה-XML של JSON ל-XML שנכשלה. לדוגמה, במדיניות הבאה מ-JSON ל-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> הוא מטען ייעודי (payload) תקין בפורמט JSON. אם הקלט לא תקין או שהפורמט שלו שגוי, זאת הסיבה לשגיאה.

    נניח שקובץ ה-JSON הלא תקין הבא הועבר למדיניות

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

    זוהי דוגמה לקריאה ל-API שבה מוצג איך הבקשה הועברה:

    curl -v "http://<org>-<env>.apigee.net/v1/testjsontoxml" -H "Content-Type:
    application/json" -X POST -d '[ "args" : ["name" : "Google" ]]'
    

    מטען ה-JSON הייעודי שמועבר בבקשה לא תקין כי אובייקט ה-JSON מתחיל ומסתיים בסוגריים מרובעים ([ ]). לכן, מתקבל קוד השגיאה:

    steps.json2xml.ExecutionFailed

    השגיאה הזו יכולה להופיע גם אם רכיב <Source> הוגדר כ-response אבל מטען ה-JSON בתגובה לא תקין או שהוא מעוצב בצורה לא נכונה.

רזולוציה

מוודאים שהקלט שמועבר למדיניות JSON ל-XML ברכיב <Source> תקין ולא פגום.

כדי לפתור את הבעיה בדוגמה למדיניות JSON ל-XML שצוינה למעלה, צריך להעביר בקשה תקינה של מטען ייעודי (payload) בפורמט 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"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם המשתנה שצוין ברכיב <Source> של מדיניות JSON ל-XML הוא מסוג מחרוזת, והרכיב <OutputVariable> לא מוגדר. האלמנט <OutputVariable> הוא חובה כשסוג המשתנה שמוגדר באלמנט <Source> הוא מחרוזת.

אבחון

  1. מזהים את מדיניות ה-JSON ל-XML שבה התרחשה השגיאה. אפשר למצוא את הערך הזה ברכיב faultstring של תגובת השגיאה. לדוגמה, בשורה faultstring הבאה, שם המדיניות הוא Check-JSONToXML:

    "faultstring": "JSONToXML[Check-JSONToXML]: Output variable is not available."
    
  2. ב-JSON שנכשל, צריך לבדוק אם הערך <OutputVariable> חסר.

    בדוגמה הבאה של מדיניות JSONToXML חסר רכיב <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. מאתרים את הקוד בשרת ה-proxy של ה-API שבו הוגדר המשתנה בפעם הראשונה.
    2. אחרי שמגלים באיזו מדיניות המשתנה מוגדר ומאוכלס לראשונה, צריך לקבוע את סוג המשתנה באופן הבא:
      1. בודקים את הערך של מאפיין הסוג (אם הוא קיים).
      2. אם מאפיין הסוג לא קיים, המשתנה נחשב למחרוזת.
    3. אם סוג המשתנה הוא מחרוזת, זו הסיבה לשגיאה. במאמר הפניה למשתנים אפשר לקרוא על משתנים נפוצים ועל הסוגים שלהם.

    לדוגמה, אפשר לראות את המשתנה PostalCode במדיניות JSON ל-XML שלמעלה.

    לדוגמה, נניח שמשתמשים במדיניות 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 משמש ברכיב <Source> של מדיניות JSONToXML:

    <Source>PostalCode</Source>
    

    מכיוון ש-PostalCode הוא מסוג מחרוזת והרכיב <OutputVariable> חסר, מתקבל קוד השגיאה:

    steps.json2xml.OutputVariableIsNotAvailable
    

רזולוציה

אם המשתנה שצוין ברכיב <Source> של המדיניות JSONToXML הוא מסוג מחרוזת, צריך לוודא שהרכיב <OutputVariable> מוגדר במדיניות.

כדי לתקן את מדיניות JSONToXML שמוסברת למעלה, צריך לכלול רכיב <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> יהיה זהה.

הסוגים התקינים הם message ו-string.

אבחון

  1. מזהים את מדיניות ה-JSON ל-XML שבה התרחשה השגיאה. אפשר למצוא את הערך הזה ברכיב faultstring של תגובת השגיאה. לדוגמה, בשורה faultstring הבאה, שם המדיניות הוא JSONToXML_checktype:

    "faultstring": "JSONToXML[JSONToXML_checktype]: String can not be assigned to message type."
    
  2. בהערה על מדיניות JSON ל-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 Proxy שבו כל אחד מהמשתנים האלה הוגדר לראשונה.
    2. אחרי שמגלים באיזו מדיניות המשתנה מוגדר ומאוכלס לראשונה, צריך לקבוע את סוג המשתנה באופן הבא:
      1. בודקים את הערך של מאפיין הסוג (אם הוא קיים).
      2. אם מאפיין הסוג לא קיים, המשתנה נחשב למחרוזת.
    3. אם סוג המשתנה שצוין ב-<Source> הוא מחרוזת, וסוג המשתנה שצוין ב-<OutputVariable> הוא הודעה, או להפך, זו הסיבה לשגיאה. במאמר הפניה למשתנים אפשר לקרוא על משתנים נפוצים ועל הסוגים שלהם.

    לדוגמה, נניח שיש מדיניות 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 משמש ברכיב <Source> של מדיניות JSONToXML:

    <Source>PostalCode</Source>
    

    באופן דומה, נזכיר שהמשתנה response משמש ברכיב <OutputVariable> של מדיניות JSONToXML:

    <OutputVariable>response</OutputVariable>
    

    ‫PostalCode הוא מסוג מחרוזת, והמשתנה response הוא מסוג הודעה. אלה סוגים לא תואמים, ולכן מוצג קוד השגיאה:

    steps.json2xml.InCompatibleTypes
    

    השגיאה שלמעלה יכולה להתרחש גם אם המשתנה ברכיב <Source> הוא מסוג message, אבל המשתנה ברכיב <OutputVariable> הוא מסוג מחרוזת.

רזולוציה

חשוב לוודא שסוג המשתנה שמוגדר ברכיב <Source> וברכיב <OutputVariable> תמיד זהה. חובה שסוג המשתנים שמופיעים ברכיב <Source> וברכיב <OutputVariable> יהיה זהה. כלומר, מוודאים שהסוג של <Source> ושל רכיבי <OutputVariable> הוא מחרוזת או סוג הודעה.

כדי לתקן את מדיניות ה-JSON ל-XML שמוסברת למעלה, אפשר להצהיר על משתנה נוסף PostalCode_output מסוג מחרוזת באמצעות מדיניות הקצאת ההודעה, ולהשתמש במשתנה הזה ברכיב <OutputVariable> של מדיניות ה-JSON ל-XML.

שינוי במדיניות בנושא הקצאת הודעות:

<?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>

מדיניות JSONToXML שעברה שינוי:

<?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> לא תקין.הסוגים התקינים של משתנים הם message ו-string.

אבחון

  1. לזהות את סוג המקור הלא תקין שמשמש במדיניות JSON ל-XML. המידע הזה מופיע בהודעת השגיאה. לדוגמה, בשגיאה הבאה, הסוג הלא תקין הוא Integer.

    "faultstring": "JSONToXML[class java.lang.Integer]: Invalid source type class java.lang.Integer. Valid source types are [message, string]."
    
  2. בודקים את כל כללי המדיניות של JSON ל-XML ב-API Proxy הספציפי שבו אירע הכשל. במדיניות JSON to XML שנכשלה, רושמים את שם המשתנה שצוין ב-<Source>.

    זו דוגמה למדיניות שבה המשתנה EmployeeID מצוין ברכיב <Source>:

<?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 Proxy שבו המשתנה הזה הוגדר לראשונה.
    2. אחרי שמגלים באיזו מדיניות המשתנה מוגדר ומאוכלס לראשונה, צריך לקבוע את סוג המשתנה באופן הבא:
      1. בודקים את הערך של מאפיין הסוג (אם הוא קיים).
      2. אם מאפיין הסוג לא קיים, המשתנה נחשב למחרוזת.
    3. אם סוג המשתנה שצוין ב-<Source> הוא לא מסוג הודעה ולא מסוג מחרוזת, זו הסיבה לשגיאה. במאמר הפניה למשתנים אפשר לקרוא על משתנים נפוצים ועל הסוגים שלהם.

    לדוגמה, נניח שמדיניות ExtractVariables משמשת לחילוץ הערך ממטען ייעודי (payload) של JSON ולהגדרת הערך למשתנה EmployeeID מסוג integer, כמו שמוצג בהמשך:

    <?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 משמש ברכיב <Source> של מדיניות JSONToXML:

    <Source>EmployeeID</Source>
    

    סוג המשתנה הזה הוא Integer, שהוא לא סוג <Source> תקין, ולכן ה-API Proxy נכשל עם השגיאה:

    steps.json2xml.InvalidSourceType
    

רזולוציה

מוודאים שסוג המשתנה שמשמש לציון הרכיב <Source> תקין. הסוגים התקינים של <Source> הם message ו-string.

כדי להימנע מהשגיאה שלמעלה במדיניות JSONToXML, אפשר להשתמש במשתנה request שהוא מסוג message או בכל מחרוזת אחרת שהיא מטען ייעודי (payload) תקין בפורמט JSON.