Khắc phục sự cố thời gian chạy về Hoạt động bản đồ giá trị khoá

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

UnsupportedOperationException

Mã lỗi

java.lang.UnsupportedOperationException

Nội dung phản hồi về lỗi

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

Nguyên nhân

Lỗi này xảy ra nếu bạn đặt thuộc tính mapIdentifier thành một chuỗi trống trong chính sách về Thao tác ánh xạ giá trị khoá.

Chẩn đoán

  1. Kiểm tra tất cả chính sách về Thao tác ánh xạ khoá-giá trị trong Proxy API cụ thể nơi xảy ra lỗi. Nếu có bất kỳ chính sách nào về Thao tác ánh xạ khoá-giá trị trong đó thuộc tính mapIdentifier được đặt thành chuỗi trống, thì đó là nguyên nhân gây ra lỗi.

    Ví dụ: Chính sách Thao tác ánh xạ khoá-giá trị sau đây có mapIdentifier trống:

    <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>
    

Độ phân giải

Đảm bảo rằng thuộc tính mapIdentifier được đặt thành một bản đồ khoá-giá trị hợp lệ trong Chính sách về hoạt động bản đồ khoá-giá trị.

Để sửa chính sách mẫu ở trên, bạn có thể chỉ định mapIdentifier cho một ánh xạ giá trị khoá hiện có 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

Mã lỗi

steps.keyvaluemapoperations.SetVariableFailed

Nội dung phản hồi lỗi

{
   "fault":{
      "faultstring":"Failed to set variable variable_name in KeyValueMapStepDefinition policy_name",
      "detail":{
         "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
      }
   }
}

Ví dụ về thông báo lỗi

{
   "fault":{
      "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM",
      "detail":{
         "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
      }
   }
}

Nguyên nhân

Lỗi này xảy ra nếu bạn cố gắng truy xuất một giá trị từ bản đồ giá trị khoá đã mã hoá và đặt giá trị đó thành một biến có tên không có tiền tố private.. Tiền tố (yêu cầu cho các mục đích bảo mật cơ bản trong quá trình gỡ lỗi) sẽ ẩn các giá trị đã mã hoá khỏi các phiên gỡ lỗi và theo dõi proxy API.

Chẩn đoán

1. Xác định chính sách Thao tác ánh xạ khoá-giá trị nơi xảy ra lỗi và tên của biến không thể đặt giá trị. Bạn có thể tìm thấy cả hai mục này trong phần tử faultstring của phản hồi lỗi. Ví dụ: trong faultstring sau đây, tên chính sách là EncryptedKVM và biến là myvar:

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

1. Trong tệp XML chính sách về thao tác ánh xạ khoá-giá trị không thành công, hãy xác minh rằng tên của biến được chỉ định trong thuộc tính assignTo của phần tử <Get> khớp với tên biến được xác định trong chuỗi lỗi (bước 1 ở trên). Ví dụ: Chính sách về thao tác ánh xạ khoá-giá trị sau đây chỉ định một biến có tên là myvar trong phần tử <Get>, khớp với nội dung trong 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. Kiểm tra xem bản đồ giá trị khoá được chỉ định trong thuộc tính mapIdentifier có phải là KVM đã mã hoá hay không. Nếu KVM được mã hoá ở phạm vi môi trường, bạn có thể xác minh rằng KVM đó được mã hoá trong giao diện người dùng Edge. Nếu không, nếu API này được tạo ở phạm vi tổ chức hoặc phạm vi proxy API, bạn cần sử dụng API quản lý để xác minh xem API đó có được mã hoá hay không. Xem thêm phần Quản lý và sử dụng KVM.

    Cách kiểm tra xem KVM trong phạm vi môi trường có được mã hoá trong giao diện người dùng Edge hay không:

    1. Trong giao diện người dùng Edge, hãy nhấp vào Quản trị trong trình đơn điều hướng bên trái.
    2. Nhấp vào Môi trường.
    3. Nhấp vào Bản đồ giá trị chính.
    4. Tìm Bản đồ khoá-giá trị mà bạn muốn sử dụng.
    5. Nhấp vào mũi tên ở bên trái tên để mở rộng danh sách giá trị.
    6. Bản đồ khoá-giá trị đã mã hoá hiển thị các giá trị được che bằng dấu hoa thị trong giao diện người dùng (*****) như trong phần Giới thiệu về KVM đã mã hoá.

    Để kiểm tra xem một KVM trong phạm vi tổ chức, môi trường hoặc apiproxy đã được mã hoá hay chưa, hãy sử dụng API Quản lý. Nếu bạn sử dụng API, một phản hồi mẫu cho thấy cả chế độ cài đặt đã mã hoá và dấu hoa thị cho giá trị sẽ có dạng như sau:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. Nếu bản đồ giá trị khoá là KVM đã mã hoá và tên biến được sử dụng trong thuộc tính assignTo của phần tử <Get> không có tiền tố private. Vậy thì đó chính là nguyên nhân gây ra lỗi.

    Trong chính sách ví dụ về Thao tác ánh xạ khoá-giá trị ở trên, bản đồ khoá-giá trị testEncrypted được mã hoá và tên biến myvar không có tiền tố private. Do đó, bạn sẽ nhận được mã lỗi:

    steps.keyvaluemapoperations.SetVariableFailed
    

Độ phân giải

Đảm bảo rằng tên biến có tiền tố private. trong thuộc tính assignTo của phần tử <Get> trong chính sách về Thao tác ánh xạ giá trị khoá nếu ánh xạ giá trị khoá được sử dụng được mã hoá.

Để sửa chính sách về Thao tác trên bản đồ khoá-giá trị mẫu ở trên, bạn có thể sửa đổi giá trị của thuộc tính assignTo thành 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>