키 값 맵 작업 런타임 오류 문제 해결

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 프록시 Trace 및 디버그 세션에서의 암호화된 값을 숨깁니다.

진단

1. 오류가 발생한 키 값 맵 작업 정책과 값을 설정할 수 없는 변수의 이름을 식별합니다. 두 항목 모두 오류 응답의 faultstring 요소에서 찾을 수 있습니다. 예를 들어 다음 faultstring에서 정책 이름은 EncryptedKVM이고 변수는 myvar입니다.

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

1. 해당 키 값 매핑 작업 정책 XML에서 <Get> 키 요소의 assignTo 속성에 지정된 변수의 이름이 위 1단계의 오류 문자열에 식별된 변수 이름과 일치하는지 확인합니다. 예를 들어, 다음 키 값 맵 작업 정책은 faultstring의 내용과 일치하는 <Get> 요소에서 myvar라는 변수를 지정합니다.

  <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. 암호화된 KVM 정보에 표시된 것처럼 암호화된 키 값 맵은 UI 내의 별표(*****)로 마스킹된 값을 표시합니다.

    조직, 환경 또는 apiproxy 수준으로 범위가 지정된 KVM이 암호화되었는지 확인하려면 관리 API를 사용하세요. API를 사용하는 경우 값의 암호화된 설정과 별표를 모두 표시하는 샘플 응답은 다음과 같습니다.

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. 키 값 맵이 암호화된 KVM이고 <Get> 요소의 assignTo 속성에 사용되는 변수 이름에 프리픽스 private이 없는 경우 이는 오류의 원인이 됩니다.

    위의 키 값 맵 작업 정책 예시에서는 키 값 맵 testEncrypted가 암호화되고 변수 이름 myvar에 프리픽스 private이 없습니다. 따라서 다음과 같은 오류 코드가 수신됩니다.

    steps.keyvaluemapoperations.SetVariableFailed
    

해결 방법

사용된 키 값 맵이 암호화된 경우 키 값 맵 작업 정책에 있는 <Get> 요소의 assignTo 속성에 있는 변수 이름에 프리픽스 private.가 있는지 확인합니다.

위의 키 값 맵 작업 정책 예시를 수정하려면 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>