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

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 एट्रिब्यूट में दिया गया 'की वैल्यू मैप' एन्क्रिप्ट (सुरक्षित) किया गया KVM है या नहीं. अगर केवीएम को एनवायरमेंट के स्कोप पर एन्क्रिप्ट (सुरक्षित) किया गया है, तो इसकी पुष्टि की जा सकती है पर क्लिक करें. अगर इसे संगठन या apiproxy के दायरे में बनाया गया है, तो आपको यह पुष्टि करने के लिए मैनेजमेंट एपीआई का इस्तेमाल करना होगा कि इसे एन्क्रिप्ट किया गया है या नहीं. KVM को मैनेज और इस्तेमाल करना लेख भी पढ़ें.

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

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

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

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

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

    steps.keyvaluemapoperations.SetVariableFailed
    

रिज़ॉल्यूशन

पक्का करें कि assignTo एट्रिब्यूट में वैरिएबल के नाम का प्रीफ़िक्स private. हो की वैल्यू मैप ऑपरेशन नीति में, <Get> एलिमेंट की होगी, अगर 'की वैल्यू मैप' का इस्तेमाल एन्क्रिप्ट किया गया है.

ऊपर दिखाई गई कुंजी मान मैप ऑपरेशन नीति को ठीक करने के लिए, आप private.myvar के लिए assignTo विशेषता का मान:

<?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>