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

คุณกำลังดูเอกสารประกอบ 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 ให้คลิก Admin ในเมนูการนำทางด้านซ้าย
    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>