কী-ভ্যালু ম্যাপ অপারেশন রানটাইম সমস্যার সমাধান করা

আপনি 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. প্রিফিক্স নেই, তাহলে এই সমস্যাটি হয়। ডিবাগিংয়ের সময় প্রাথমিক নিরাপত্তা সংক্রান্ত কারণে প্রয়োজনীয় প্রিফিক্স, API প্রক্সি ট্রেস ও ডিবাগ সেশন থেকে এনক্রিপ্ট করা মান লুকিয়ে রাখে।

ডায়াগনসিস

১. কী ভ্যালু ম্যাপ অপারেশনের সেই নীতি শনাক্ত করুন যেখানে সমস্যা হয়েছে এবং সেই ভেরিয়েবলের নাম শনাক্ত করুন যেখানে ভ্যালু সেট করা যাচ্ছে না। আপনি সমস্যার উত্তরের faultstring এলিমেন্টে এই দুটি আইটেমই খুঁজে পাবেন। যেমন, নিম্নলিখিত faultstring-এ, নীতির নাম হল EncryptedKVM এবং ভেরিয়েবল হল myvar:

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

১. কী ভ্যালু ম্যাপ অপারেশন সংক্রান্ত নীতি XML কাজ না করলে, <Get> এলিমেন্টের assignTo অ্যাট্রিবিউটে নির্দিষ্ট করা ভেরিয়েবলের নাম ফল্ট স্ট্রিংয়ে (উপরে #১ ধাপ) শনাক্ত করা ভেরিয়েবলের নামের সাথে ম্যাচ করছে কিনা তা যাচাই করুন। যেমন, নিম্নলিখিত কী-ভ্যালু ম্যাপ অপারেশন নীতিতে <Get> এলিমেন্টে myvar নামের একটি ভেরিয়েবল নির্দিষ্ট করা হয়েছে, যা 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 UI-তে এটি এনক্রিপ্ট করা আছে কিনা তা যাচাই করতে পারবেন। অন্যথায়, এটি যদি কোনও সংস্থা বা apiproxy স্কোপে তৈরি করা হয়ে থাকে, তাহলে এটি এনক্রিপ্ট করা আছে কিনা তা যাচাই করতে আপনাকে ম্যানেজমেন্ট API ব্যবহার করতে হবে। এছাড়াও, KVM ম্যানেজ ও ব্যবহার করা দেখুন।

    Edge UI-তে এনভায়রনমেন্ট স্কোপ করা KVM এনক্রিপ্ট করা আছে কিনা তা চেক করতে:

    1. Edge UI-তে, বাঁদিকের নেভিগেশন মেনুতে অ্যাডমিন বিকল্পে ক্লিক করুন।
    2. এনভায়রনমেন্ট বিকল্পে ক্লিক করুন।
    3. কী ভ্যালু ম্যাপ বিকল্পে ক্লিক করুন।
    4. আপনি যে Key Value Map ব্যবহার করতে চান সেটি খুঁজে নিন।
    5. মানগুলির তালিকা বড় করে দেখতে নামের বাঁদিকে থাকা তীরচিহ্নে ক্লিক করুন।
    6. এনক্রিপ্ট করা কী ভ্যালু ম্যাপ, UI-তে (*****) অ্যাস্টেরিস্ক দিয়ে মাস্ক করা ভ্যালু দেখায়, যেমন এনক্রিপ্ট করা KVM সম্পর্কে নিবন্ধে দেখানো হয়েছে।

    সংস্থা, এনভায়রনমেন্ট বা apiproxy লেভেলে স্কোপ করা KVM এনক্রিপ্ট করা আছে কিনা তা চেক করতে, ম্যানেজমেন্ট API ব্যবহার করুন। আপনি API ব্যবহার করলে, এনক্রিপ্ট করা সেটিং ও ভ্যালুর জন্য অ্যাস্টেরিক্স, দু'টিই দেখায় এমন একটি নমুনা উত্তর এইরকম দেখতে হয়:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. কী ভ্যালু ম্যাপটি এনক্রিপ্ট করা KVM হলে এবং <Get> এলিমেন্টের assignTo অ্যাট্রিবিউটে ব্যবহৃত ভেরিয়েবল নামের আগে private প্রিফিক্স না থাকলে। তাহলে এটিই সমস্যার কারণ।

    উপরে দেখানো উদাহরণে, কী ভ্যালু ম্যাপ অপারেশন নীতিতে, কী ভ্যালু ম্যাপ testEncrypted এনক্রিপ্ট করা আছে এবং ভেরিয়েবলের নাম myvar-এর আগে private প্রিফিক্স নেই। তাই আপনি এই সমস্যার কোডটি পাবেন:

    steps.keyvaluemapoperations.SetVariableFailed
    

রেজোলিউশন

কী ভ্যালু ম্যাপ অপারেশন নীতিতে <Get> এলিমেন্টের assignTo অ্যাট্রিবিউটে ভেরিয়েবলের নামের আগে 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>