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

אתם מציגים את מסמכי התיעוד של Apigee Edge.
כניסה למסמכי העזרה של Apigee X.
info

UnsupportedOperationException

קוד שגיאה

java.lang.UnsupportedOperationException

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

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

סיבה

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

אבחון

  1. בודקים את כל כללי המדיניות של פעולות המיפוי של מפתח/ערך ב-proxy הספציפי ל-API שבו אירעה התקלה. אם יש מדיניות של פעולות של מפות מפתח/ערך שבה מאפיין 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>apiproxy</Scope>
    </KeyValueMapOperations>
    

רזולוציה

מוודאים שהמאפיין mapIdentifier מוגדר למיפוי של מפתח/ערך תקין במדיניות של פעולות של מיפוי מפתח/ערך.

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

אבחון

1. צריך לזהות את המדיניות בנושא פעולות במפת ערכי מפתח שבה אירעה השגיאה ואת שם המשתנה שלא ניתן להגדיר לו את הערך. שני הפריטים האלה מופיעים ברכיב 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 מוצפן ברמת הסביבה, אפשר לוודא שהוא מוצפן בממשק המשתמש של Edge. אחרת, אם הוא נוצר בהיקף של הארגון או של ה-apiproxy, צריך להשתמש ב-Management API כדי לוודא שהוא מוצפן. מידע נוסף זמין במאמר ניהול מכונות KVM ושימוש בהן.

    כדי לבדוק אם מכונה וירטואלית ברמת הסביבה מוצפנת בממשק המשתמש של Edge:

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

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

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

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

    steps.keyvaluemapoperations.SetVariableFailed
    

רזולוציה

אם מפת ערכי המפתחות שבה נעשה שימוש מוצפנת, צריך לוודא ששם המשתנה מכיל את הקידומת private. במאפיין assignTo של רכיב <Get> במדיניות של פעולות של מפת ערכי מפתחות.

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