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

הדף הזה רלוונטי ל-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. צריך לבדוק את כל כללי המדיניות של Key Value Map Operations ב-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>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 למעלה). לדוגמה, במדיניות 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 מוצפן בממשק המשתמש של Apigee:

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