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

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

पर क्लिक करें.

UnsupportedOperationException

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

java.lang.UnsupportedOperationException

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

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

वजह

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

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

  1. उस एपीआई प्रॉक्सी में, Key Value Map Operations से जुड़ी सभी नीतियों की जांच करें जहां गड़बड़ी हुई है. अगर Key Value Map Operations की किसी नीति में mapIdentifier एट्रिब्यूट को खाली स्ट्रिंग के तौर पर सेट किया गया है, तो यह गड़बड़ी की वजह है.

    उदाहरण के लिए, यहां दी गई Key Value Map Operations नीति में 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 को, Key Value Map Operations नीति में मान्य कुंजी वैल्यू मैप पर सेट किया गया हो.

ऊपर दिखाई गई नीति के उदाहरण को ठीक करने के लिए, मौजूदा कुंजी वैल्यू मैप 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. उस Key Value Map Operations नीति की पहचान करें जहां गड़बड़ी हुई है. साथ ही, उस वैरिएबल का नाम बताएं जिसकी वैल्यू सेट नहीं की जा सकती. आपको ये दोनों आइटम, गड़बड़ी के जवाब के faultstring एलिमेंट में मिल सकते हैं. उदाहरण के लिए, यहां दिए गए faultstring में, नीति का नाम EncryptedKVM है और वैरिएबल myvar है:

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

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

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

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

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

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

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

    steps.keyvaluemapoperations.SetVariableFailed
    

रिज़ॉल्यूशन

अगर इस्तेमाल किया गया कुंजी वैल्यू मैप एन्क्रिप्ट (सुरक्षित) किया गया है, तो पक्का करें कि वैरिएबल के नाम में <Get> एलिमेंट की Key Value Map Operations नीति के assignTo एट्रिब्यूट में private. प्रीफ़िक्स मौजूद हो.

ऊपर दिखाई गई, उदाहरण के तौर पर दी गई Key Value Map Operations नीति को ठीक करने के लिए, एट्रिब्यूट 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>