عیب یابی خطای زمان اجرا Key Value Map Operations، عیب یابی خطای زمان اجرا Key Value Map Operations

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

استثنای عملیات پشتیبانی نشده

کد خطا

java.lang.UnsupportedOperationException

متن پاسخ خطا

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

علت

این خطا زمانی رخ می‌دهد که ویژگی mapIdentifier در سیاست Key Value Map Operations روی یک رشته خالی تنظیم شده باشد.

تشخیص

  1. تمام سیاست‌های عملیات نقشه کلید مقدار (Key Value Map Operations) را در پروکسی 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 به یک map با مقدار کلیدی موجود 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>

تنظیم متغیر ناموفق

کد خطا

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 در جلسات ردیابی و اشکال‌زدایی پنهان می‌کند.

تشخیص

۱. سیاست عملیات نقشه کلید مقدار (Key Value Map Operations) که خطا در آن رخ داده است و نام متغیری که نمی‌توان مقدار را روی آن تنظیم کرد را شناسایی کنید. می‌توانید هر دوی این موارد را در عنصر faultstring پاسخ خطا پیدا کنید. به عنوان مثال، در faultstring زیر، نام سیاست EncryptedKVM و متغیر myvar است:

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

۱. در سیاست ناموفق عملیات نقشه کلید مقدار XML، بررسی کنید که نام متغیر مشخص شده در ویژگی assignTo از عنصر <Get> با نام متغیر شناسایی شده در رشته خطا (مرحله ۱ بالا) مطابقت داشته باشد. به عنوان مثال، سیاست عملیات نقشه کلید مقدار زیر، متغیری به نام 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 ایجاد شده باشد، باید از API مدیریت برای تأیید رمزگذاری آن استفاده کنید. همچنین به مدیریت و استفاده از KVM ها مراجعه کنید.

    برای بررسی اینکه آیا KVM در محدوده محیطی در رابط کاربری Edge رمزگذاری شده است یا خیر:

    1. در رابط کاربری اج، در منوی ناوبری سمت چپ روی گزینه‌ی «مدیر» کلیک کنید.
    2. روی محیط‌ها کلیک کنید.
    3. روی نقشه‌های مقادیر کلیدی کلیک کنید.
    4. نقشه کلید-مقدار (Key Value Map) مورد نظر خود را پیدا کنید.
    5. برای باز کردن لیست مقادیر، روی پیکان سمت چپ نام کلیک کنید.
    6. نقشه‌های کلید-مقدار رمزگذاری‌شده، مقادیری را که با ستاره در رابط کاربری (*****) پوشانده شده‌اند، همانطور که در بخش «درباره KVMهای رمزگذاری‌شده» نشان داده شده است، نمایش می‌دهند.

    برای بررسی اینکه آیا یک KVM که در سطح سازمان، محیط یا apiproxy قرار دارد رمزگذاری شده است، از APIهای مدیریتی استفاده کنید. اگر از API استفاده می‌کنید، یک پاسخ نمونه که هم تنظیمات رمزگذاری شده و هم ستاره‌های مربوط به مقدار را نشان می‌دهد، به این شکل است:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. اگر نگاشت کلید-مقدار یک KVM رمزگذاری شده باشد و نام متغیر استفاده شده در ویژگی assignTo از عنصر <Get> پیشوند private نداشته باشد، دلیل خطا همین است.

    در مثال مربوط به سیاست عملیات نگاشت مقدار کلید که در بالا نشان داده شده است، نگاشت مقدار کلید testEncrypted رمزگذاری شده است و نام متغیر myvar پیشوند private را ندارد. از این رو کد خطا را دریافت می‌کنید:

    steps.keyvaluemapoperations.SetVariableFailed
    

وضوح تصویر

اگر نقشه کلید-مقدار مورد استفاده رمزگذاری شده است، مطمئن شوید که نام متغیر در ویژگی assignTo از عنصر <Get> در سیاست عملیات نقشه کلید-مقدار، پیشوند private.

برای اصلاح سیاست عملیات نقشه ارزش کلیدی مثال بالا، می‌توانید مقدار ویژگی 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>