פתרון בעיות של שגיאות זמן ריצה בפעולות של מיפוי בין מפתח לערך

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

UnsupportedOperationException

קוד שגיאה

java.lang.UnsupportedOperationException

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

{
   "fault":{
      "faultstring":"java.lang.UnsupportedOperationException",
      "detail":{
         "errorcode":"Internal Server Error"
      }
   }
}

סיבה

השגיאה הזו מתרחשת אם המאפיין mapIdentifier מוגדר למחרוזת ריקה במדיניות Key Value Map Operations.

אבחון

  1. בודקים את כל כללי המדיניות של פעולות מפה עם מפתח/ערך ב-API Proxy הספציפי שבו התרחשה הכשל. אם יש מדיניות Key Value Map Operations שבה המאפיין mapIdentifier מוגדר כמחרוזת ריקה, זו הסיבה לשגיאה.

    לדוגמה, במדיניות Key Value Map Operations הבאה, התג mapIdentifier ריק:

    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreKvm" mapIdentifier="">
        <DisplayName>StoreKvm</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
        <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
        <Put override="true">
            <Key>
                <Parameter ref="request.queryparam.key"/>
            </Key>
            <Value ref="request.queryparam.value"/>
        </Put>
        <Scope>apiproxy</Scope>
    </KeyValueMapOperations>
    

רזולוציה

מוודאים שהמאפיין mapIdentifier מוגדר למפת ערכי מפתח תקינה במדיניות Key Value Map Operations.

כדי לתקן את מדיניות הדוגמה שמוצגת למעלה, אפשר לציין את mapIdentifier למיפוי קיים של ערכי מפתח UserLocationMap.

<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreKvm" mapIdentifier="UserLocationMap">
    <DisplayName>StoreKvm</DisplayName>
    <Properties/>
    <ExclusiveCache>false</ExclusiveCache>
    <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
    <Put override="true">
        <Key>
            <Parameter ref="request.queryparam.key"/>
        </Key>
        <Value ref="request.queryparam.value"/>
    </Put>
    <Scope>apiproxy</Scope>
</KeyValueMapOperations>

SetVariableFailed

קוד שגיאה

steps.keyvaluemapoperations.SetVariableFailed

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

{
   "fault":{
      "faultstring":"Failed to set variable variable_name in KeyValueMapStepDefinition policy_name",
      "detail":{
         "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
      }
   }
}

הודעת שגיאה לדוגמה

{
   "fault":{
      "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM",
      "detail":{
         "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
      }
   }
}

סיבה

השגיאה הזו מתרחשת אם מנסים לאחזר ערך ממפת ערכי מפתח מוצפנת ולהגדיר את הערך למשתנה שהשם שלו לא מתחיל בקידומת private.. הקידומת, שנדרשת למטרות אבטחה בסיסיות במהלך ניפוי הבאגים, מסתירה את הערכים המוצפנים מ-Trace של proxy ל-API ומסשנים של ניפוי באגים.

אבחון

1. מזהים את מדיניות הפעולות של Key Value Map שבה התרחשה השגיאה ואת שם המשתנה שלא ניתן להגדיר לו ערך. אפשר למצוא את שני הפריטים האלה ברכיב faultstring של תגובת השגיאה. לדוגמה, בקטע faultstring הבא, שם המדיניות הוא EncryptedKVM והמשתנה הוא myvar:

  "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM"

1. ב-XML של מדיניות Key Value Map Operations שנכשלה, מוודאים שהשם של המשתנה שצוין במאפיין assignTo של האלמנט <Get> זהה לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, במדיניות Key Value Map Operations הבאה מוגדר משתנה בשם myvar ברכיב <Get>, שתואם למה שמוגדר ברכיב faultstring:

  <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Key-Value-Map-Operations-1" mapIdentifier="testEncrypted">
      <DisplayName>KeyValueMapOperations-1</DisplayName>
      <Properties/>
      <ExclusiveCache>false</ExclusiveCache>
      <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
      <Get assignTo="myvar" index="1">
          <Key>
              <Parameter>foo</Parameter>
          </Key>
      </Get>
      <Scope>environment</Scope>
  </KeyValueMapOperations>
  1. בודקים אם מיפוי צמדי המפתח/ערך שצוין במאפיין mapIdentifier הוא KVM מוצפן. אם ה-KVM מוצפן בהיקף הסביבה, אפשר לוודא שהוא מוצפן בממשק המשתמש של Edge. אחרת, אם הוא נוצר בהיקף של ארגון או של apiproxy, צריך להשתמש ב-Management API כדי לוודא שהוא מוצפן. מידע נוסף זמין במאמר בנושא ניהול של KVM ושימוש בו.

    כדי לבדוק אם KVM בהיקף סביבה מוצפן בממשק המשתמש של Edge:

    1. בממשק המשתמש של Edge, לוחצים על Admin (אדמין) בתפריט הניווט הימני.
    2. לוחצים על סביבות.
    3. לוחצים על Key Value Maps (מיפוי של ערכי מפתח).
    4. מוצאים את מיפוי זוגות הערכים שרוצים להשתמש בו.
    5. לוחצים על החץ שמימין לשם כדי להרחיב את רשימת הערכים.
    6. במפות מוצפנות של זוגות מפתח/ערך, הערכים מוצגים בממשק המשתמש עם כוכביות (*****) כמו שמוצג במאמר מידע על מפות מוצפנות של זוגות מפתח/ערך.

    כדי לבדוק אם KVM בהיקף הארגון, הסביבה או apiproxy מוצפן, משתמשים בממשקי Management API. אם משתמשים ב-API, דוגמה לתגובה שבה מוצגת ההגדרה המוצפנת וכוכביות במקום הערך נראית כך:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. אם מפת זוגות מפתח/ערך היא KVM מוצפן ושם המשתנה שמשמש במאפיין assignTo של הרכיב <Get> לא כולל את התחילית private. אם כן, זו הסיבה לשגיאה.

    בדוגמה של מדיניות הפעולות במפת זוגות של מפתח/ערך שמוצגת למעלה, מפת זוגות של מפתח/ערך testEncrypted מוצפנת ולשם המשתנה myvar אין את הקידומת private. לכן קיבלת את קוד השגיאה:

    steps.keyvaluemapoperations.SetVariableFailed
    

רזולוציה

אם מפת זוגות הערכים שבה נעשה שימוש מוצפנת, צריך לוודא שלשם המשתנה יש את הקידומת private. במאפיין assignTo של רכיב <Get> במדיניות Key Value Map Operations.

כדי לתקן את המדיניות לדוגמה של פעולות במיפוי של זוגות מפתח/ערך שמוצגת למעלה, אפשר לשנות את הערך של המאפיין assignTo ל-private.myvar:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Key-Value-Map-Operations-1" mapIdentifier="testEncrypted">
    <DisplayName>KeyValueMapOperations-1</DisplayName>
    <Properties/>
    <ExclusiveCache>false</ExclusiveCache>
    <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
    <Get assignTo="private.myvar" index="1">
        <Key>
            <Parameter>foo</Parameter>
        </Key>
    </Get>
    <Scope>environment</Scope>
</KeyValueMapOperations>