मुख्य मान के मैप की कार्रवाई वाले रनटाइम की गड़बड़ी की समस्या हल करना

Apigee Edge दस्तावेज़ देखा जा रहा है.
Apigee X दस्तावेज़ पर जाएं.
जानकारी

UnsupportedOperationException

गड़बड़ी का कोड

java.lang.UnsupportedOperationException

गड़बड़ी के जवाब का मुख्य हिस्सा

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

वजह

यह गड़बड़ी तब होती है, जब कुंजी वैल्यू को मैप करने की कार्रवाई की नीति में, mapIdentifier एट्रिब्यूट को किसी खाली स्ट्रिंग पर सेट किया गया हो.

संक्रमण की जांच

  1. उस एपीआई प्रॉक्सी में, मुख्य वैल्यू को मैप करने की सभी कार्रवाइयों की नीतियों की जांच करें जहां गड़बड़ी हुई है. अगर कुंजी की वैल्यू को मैप करने से जुड़ी ऐसी कोई नीति है जिसमें 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 एट्रिब्यूट को, की वैल्यू वाले मैप ऑपरेशन की नीति में मान्य की वैल्यू मैप पर सेट किया गया हो.

ऊपर दी गई उदाहरण नीति को ठीक करने के लिए, की-वैल्यू वाले किसी मौजूदा मैप UserLocationMap में mapIdentifier तय की जा सकती है.

<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. प्रीफ़िक्स न हो. डीबग करने के दौरान बुनियादी सुरक्षा के लिए ज़रूरी प्रीफ़िक्स, एपीआई प्रॉक्सी ट्रेस और डीबग सेशन से एन्क्रिप्ट की गई वैल्यू छिपा देता है.

संक्रमण की जांच

1. कुंजी मान मैप पर कार्रवाई करने की उस नीति की पहचान करें जहां गड़बड़ी हुई और उस वैरिएबल के नाम की पहचान करें जिस पर मान सेट नहीं किया जा सकता. आपको ये दोनों आइटम, गड़बड़ी के जवाब के faultstring एलिमेंट में मिल सकते हैं. उदाहरण के लिए, इस faultstring में, नीति का नाम EncryptedKVM और वैरिएबल myvar है:

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

1. कुंजी मान मैप करने से जुड़ी जो नीति काम नहीं कर रही है उसमें पुष्टि करें कि <Get> एलिमेंट के assignTo एट्रिब्यूट में दिए गए वैरिएबल का नाम, गड़बड़ी वाली स्ट्रिंग में बताए गए वैरिएबल नाम (ऊपर दिया गया चरण #1) से मेल खाता है. उदाहरण के लिए, नीचे दी गई कुंजी मान मैप कार्रवाई की नीति <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 एट्रिब्यूट में दिया गया की वैल्यू मैप, एन्क्रिप्ट (सुरक्षित) किया गया केवीएम है या नहीं. अगर केवीएम को एनवायरमेंट स्कोप में एन्क्रिप्ट किया गया है, तो पुष्टि की जा सकती है कि उसे Edge यूज़र इंटरफ़ेस (यूआई) में एन्क्रिप्ट (सुरक्षित) किया गया है. अगर इसे संगठन या एपीआई प्रॉक्सी स्कोप में बनाया गया है, तो आपको मैनेजमेंट एपीआई का इस्तेमाल करके यह पुष्टि करनी होगी कि उसे एन्क्रिप्ट (सुरक्षित) किया गया है या नहीं. केवीएम को मैनेज और इस्तेमाल करने का तरीका भी देखें.

    यह देखने के लिए कि Edge यूज़र इंटरफ़ेस (यूआई) में एनवायरमेंट स्कोप केवीएम को एन्क्रिप्ट (सुरक्षित) किया गया है या नहीं:

    1. Edge यूज़र इंटरफ़ेस (यूआई) में, बाईं ओर दिए गए नेविगेशन मेन्यू में एडमिन पर क्लिक करें.
    2. परिवेश पर क्लिक करें.
    3. Maps की खास वैल्यू पर क्लिक करें.
    4. कुंजी मान का वह मैप ढूंढें जिसका आपको इस्तेमाल करना है.
    5. वैल्यू की सूची को बड़ा करने के लिए, नाम के बाईं ओर मौजूद ऐरो पर क्लिक करें.
    6. एन्क्रिप्ट (सुरक्षित) की गई कुंजी की वैल्यू मैप के, यूज़र इंटरफ़ेस (यूआई) (*****) में तारे के निशान वाली वैल्यू को मास्क किया गया है, जैसा कि एन्क्रिप्ट (सुरक्षित) किए गए केवीएम के बारे में जानकारी में दिखाया गया है.

    यह देखने के लिए कि संगठन, एनवायरमेंट या एपीआई प्रॉक्सी लेवल पर केवीएम का स्कोप एन्क्रिप्ट किया गया है या नहीं, Management API का इस्तेमाल करें. अगर एपीआई का इस्तेमाल किया जाता है, तो वैल्यू के लिए एन्क्रिप्ट (सुरक्षित) की गई सेटिंग और तारे के निशान, दोनों दिखाने वाला सैंपल रिस्पॉन्स ऐसा दिखता है:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. अगर की-वैल्यू मैप, एन्क्रिप्ट (सुरक्षित) किया गया केवीएम है और <Get> एलिमेंट के assignTo एट्रिब्यूट में इस्तेमाल किए गए वैरिएबल नाम में private प्रीफ़िक्स नहीं है. तो यही गड़बड़ी की वजह होगी.

    कुंजी की वैल्यू को मैप करने से जुड़ी ऊपर दी गई नीति के उदाहरण में, कुंजी मान मैप testEncrypted को एन्क्रिप्ट (सुरक्षित) किया गया है और वैरिएबल नाम myvar में private प्रीफ़िक्स नहीं है. इसलिए आपको गड़बड़ी कोड मिला:

    steps.keyvaluemapoperations.SetVariableFailed
    

रिज़ॉल्यूशन

पक्का करें कि अगर कुंजी वैल्यू वाले मैप को एन्क्रिप्ट (सुरक्षित) किया गया है, तो वैरिएबल के नाम की वैल्यू को मैप करने से जुड़ी नीति के <Get> एलिमेंट के assignTo एट्रिब्यूट में private. प्रीफ़िक्स 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>