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

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

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.

אבחון

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. לוחצים על Environments.
    3. לוחצים על מפות של מפתחות וערכים.
    4. מאתרים את מפת ערכי המפתחות שבה רוצים להשתמש.
    5. לוחצים על החץ שמימין לשם כדי להרחיב את רשימת הערכים.
    6. ערכים מוצפנים במפות Google עם ערכי מפתחות מוצפנים מוסווים כוכביות בממשק המשתמש (*****), כפי שמתואר במאמר מידע על KVMs מוצפנים.

    כדי לבדוק אם 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>