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

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

UnsupportedOperationException

קוד שגיאה

java.lang.UnsupportedOperationException

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

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

סיבה

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

אבחון

  1. בחינת כל עקרונות המדיניות של Key Value Map Operations בשרת ה-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 Trace ומסשנים של ניפוי באגים.

אבחון

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

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

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

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

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

    כדי לבדוק אם ה-KVM בהיקף ברמת הארגון, הסביבה או ה-apiproxy מוצפן, צריך להשתמש ב-Management APIs. אם משתמשים ב-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>