Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu Apigee X. thông tin
UnsupportedOperationException
Mã lỗi
java.lang.UnsupportedOperationException
Nội dung phản hồi 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 Thao tác trên bản đồ khoá giá trị.
Chẩn đoán
Kiểm tra tất cả các chính sách về Thao tác trên bản đồ khoá-giá trị trong API Proxy cụ thể nơi xảy ra lỗi. Nếu có bất kỳ chính sách Key Value Map Operations nào mà thuộc tính
mapIdentifierđược đặt thành một chuỗi trống, thì đó là nguyên nhân gây ra lỗi.Ví dụ: chính sách Key Value Map Operations sau đây có một
mapIdentifiertrố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 Thao tác trên bản đồ khoá-giá trị.
Để sửa chính sách ví dụ nêu trên, bạn có thể chỉ định mapIdentifier cho bản đồ khoá giá trị 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"
}
}
}
Thông báo lỗi mẫu
{
"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á được 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ố này là bắt buộc cho các mục đích bảo mật cơ bản trong quá trình gỡ lỗi, giúp ẩn các giá trị đã mã hoá khỏi phiên gỡ lỗi và Trace của proxy API.
Chẩn đoán
1.
Xác định chính sách Thao tác trên bản đồ khoá giá trị nơi xảy ra lỗi và tên của biến mà giá trị không thể đặt. 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 Thao tác trên bản đồ 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 Thao tác trên bản đồ 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>
Kiểm tra xem bản đồ giá trị khoá được chỉ định trong thuộc tính
mapIdentifiercó phải là KVM được 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 được tạo ở phạm vi tổ chức hoặc apiproxy, bạn cần sử dụng API Quản lý để xác minh xem khoá 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 có phạm vi môi trường có được mã hoá trong giao diện người dùng Edge hay không:
- 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.
- Nhấp vào Environments (Môi trường).
- Nhấp vào Key Value Maps (Bản đồ khoá giá trị).
- Tìm Key Value Map mà bạn muốn sử dụng.
- Nhấp vào mũi tên ở bên trái tên để mở rộng danh sách giá trị.
- Bản đồ giá trị khoá được mã hoá sẽ hiển thị các giá trị được che bằng dấu hoa thị trong giao diện người dùng (*****) như minh hoạ trong phần Giới thiệu về KVM được mã hoá.
Để kiểm tra xem KVM có phạm vi ở cấp tổ chức, môi trường hoặc apiproxy có được mã hoá hay không, hãy sử dụng Management API. Nếu bạn sử dụng API, một phản hồi mẫu cho thấy cả chế độ cài đặt được mã hoá và dấu hoa thị cho giá trị sẽ có dạng như sau:
{ "encrypted": true, "entry": [ { "name": "foo", "value": "*****" } ], "name": "encrypted" }Nếu bản đồ giá trị khoá là một KVM được mã hoá và tên biến được dùng trong thuộc tính
assignTocủa phần tử<Get>không có tiền tốprivate. Vậy thì đó là nguyên nhân gây ra lỗi.Trong chính sách Thao tác với bản đồ khoá giá trị trong ví dụ nêu trên, bản đồ khoá giá trị
testEncryptedđược mã hoá và tên biếnmyvarkhông có tiền tốprivate. Do đó, bạn 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 Thao tác trên bản đồ khoá giá trị nếu bản đồ khoá giá trị được dùng đã mã hoá.
Để sửa chính sách Key Value Map Operations (Thao tác trên tập hợp khoá-giá trị) trong ví dụ nê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>