การแก้ปัญหาเกี่ยวกับรันไทม์ของการดำเนินการแมปคีย์-ค่า

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
info

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

การวินิจฉัย

1. ระบุนโยบายการดำเนินการกับแมปค่าคีย์ที่เกิดข้อผิดพลาดและชื่อของตัวแปรที่กำหนดค่าไม่ได้ คุณดูรายการทั้ง 2 รายการนี้ได้ในองค์ประกอบ faultstring ของการตอบกลับข้อผิดพลาด เช่น ในfaultstringต่อไปนี้ ชื่อนโยบายคือ EncryptedKVM และตัวแปรคือ myvar

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

1. ใน XML ของนโยบายการดำเนินการกับแผนที่ค่าคีย์ที่ล้มเหลว ให้ตรวจสอบว่าชื่อของตัวแปรที่ระบุในแอตทริบิวต์ assignTo ขององค์ประกอบ <Get> ตรงกับชื่อตัวแปรที่ระบุในสตริงข้อผิดพลาด (ขั้นตอนที่ 1 ด้านบน) ตัวอย่างเช่น นโยบายการดำเนินการกับแผนที่ค่าคีย์ต่อไปนี้ระบุตัวแปรชื่อ 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 ได้รับการเข้ารหัสในขอบเขตสภาพแวดล้อม คุณจะยืนยันได้ว่ามีการเข้ารหัส ใน UI ของ Edge หรือหากสร้างที่ขอบเขตองค์กรหรือ apiproxy คุณจะต้องใช้ Management API เพื่อยืนยันว่ามีการเข้ารหัสหรือไม่ โปรดดูหัวข้อการจัดการและการใช้ KVM ด้วย

    วิธีตรวจสอบว่า KVM ที่กำหนดขอบเขตสภาพแวดล้อมได้รับการเข้ารหัสใน Edge UI หรือไม่

    1. ใน UI ของ Edge ให้คลิกผู้ดูแลระบบในเมนูการนำทางด้านซ้าย
    2. คลิกสภาพแวดล้อม
    3. คลิก Key Value Maps
    4. ค้นหาแผนที่ค่าคีย์ที่ต้องการใช้
    5. คลิกลูกศรทางด้านซ้ายของชื่อเพื่อขยายรายการค่า
    6. แผนที่ค่าคีย์ที่เข้ารหัสจะแสดงค่าที่มาสก์ด้วยเครื่องหมายดอกจันใน UI (*****) ดังที่แสดงในเกี่ยวกับ KVM ที่เข้ารหัส

    หากต้องการตรวจสอบว่า KVM ที่กำหนดขอบเขตในระดับองค์กร สภาพแวดล้อม หรือ Apigee API Proxy ได้รับการเข้ารหัสหรือไม่ ให้ใช้ Management API หากคุณใช้ API ตัวอย่างการตอบกลับที่แสดงทั้งการตั้งค่าที่เข้ารหัสและเครื่องหมายดอกจันสำหรับค่าจะมีลักษณะดังนี้

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. หากแมปคีย์-ค่าเป็น KVM ที่เข้ารหัส และชื่อตัวแปรที่ใช้ในแอตทริบิวต์ assignTo ขององค์ประกอบ <Get> ไม่มีคำนำหน้า private นั่นคือสาเหตุของข้อผิดพลาด

    ในตัวอย่างนโยบายการดำเนินการกับแมปค่าคีย์ที่แสดงด้านบน แมปค่าคีย์ testEncrypted จะได้รับการเข้ารหัส และชื่อตัวแปร myvar จะไม่มีคำนำหน้า private คุณจึงได้รับรหัสข้อผิดพลาด

    steps.keyvaluemapoperations.SetVariableFailed
    

ความละเอียด

ตรวจสอบว่าชื่อตัวแปรมีคำนำหน้า private. ในแอตทริบิวต์ assignTo ขององค์ประกอบ <Get> ในนโยบายการดำเนินการกับแมปค่าคีย์ หากแมปค่าคีย์ ที่ใช้ได้รับการเข้ารหัส

หากต้องการแก้ไขนโยบายการดำเนินการกับแผนที่คีย์-ค่าตัวอย่างที่แสดงด้านบน คุณสามารถแก้ไขค่าของแอตทริบิวต์ 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>