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

คุณกำลังดูเอกสารประกอบสำหรับ 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 ระดับสภาพแวดล้อมได้รับการเข้ารหัสใน UI ของ Edge หรือไม่

    1. ใน UI ของ Edge ให้คลิกผู้ดูแลระบบในเมนูการนำทางด้านซ้าย
    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>