عیب‌یابی خطای زمان اجرای عملیات «نقشه مقدار کلید»

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

UnsupportedOperationException

کد خطا

java.lang.UnsupportedOperationException

متن پاسخ خطا

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

علت

اگر مشخصه mapIdentifier در خط‌مشی «عملیات نقشه مقدار کلید» روی رشته خالی تنظیم شده باشد، این خطا رخ می‌دهد.

تشخیص

  1. همه خط‌مشی‌های «عملیات نقشه مقدار کلید» را در «پراکسی 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. را ندارد، این خطا رخ می‌دهد. پیشوند که برای اهداف امنیتی پایه درطول اشکال‌زدایی لازم است، مقادیر رمزگذاری‌شده را از جلسات اشکال‌زدایی و «ردیابی» کارگزار میانای برنامه‌سازی کاربردی پنهان می‌کند.

تشخیص

۱. خط‌مشی «عملیات نقشه مقدار کلید» را که خطا در آن رخ داده است و نام متغیری را که مقدار آن نمی‌تواند تنظیم شود شناسایی کنید. هر دوی این موارد را می‌توانید در عنصر 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 ایجاد شده باشد، باید از «میانای برنامه‌سازی کاربردی مدیریت» برای تأیید رمزگذاری آن استفاده کنید. همچنین مدیریت و استفاده از KVM را ببینید.

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

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

    برای بررسی اینکه آیا KVM در سطح سازمان، محیط، یا apiproxy رمزگذاری شده است، از Management APIs استفاده کنید. اگر از 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>