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

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

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 מוגדר כמחרוזת ריקה, זו הסיבה לשגיאה.

    לדוגמה, במדיניות הבאה של פעולות מיפוי של זוגות מפתח/ערך יש 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>environment</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>environment</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.. הקידומת, שנדרשת למטרות אבטחה בסיסיות במהלך ניפוי הבאגים, מסתירה את הערכים המוצפנים ממעקב אחר 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 למעלה). לדוגמה, במדיניות הבאה של פעולות במפת ערכי מפתח מוגדר משתנה בשם 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 מוצפן בממשק המשתמש של Apigee:

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

    בדוגמה למדיניות Key Value Map Operations שמוצגת למעלה, מפת מפתח-ערך 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>