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

คุณกำลังดูเอกสารประกอบของ 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 และเซสชันการแก้ไขข้อบกพร่อง

การวินิจฉัย

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

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

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

    หากต้องการตรวจสอบว่า KVM กำหนดขอบเขตที่องค์กร สภาพแวดล้อม หรือระดับ apiproxy หรือไม่ ให้ใช้ 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>