Resolução de problemas de erros de tempo de execução de operações de mapas de chaves-valores

Está a ver a documentação do Apigee e do Apigee Hybrid.
Ver documentação do Apigee Edge.

UnsupportedOperationException

Código de erro

java.lang.UnsupportedOperationException

Corpo da resposta de erro

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

Causa

Este erro ocorre se o atributo mapIdentifier estiver definido como uma string vazia na política de operações de mapa de valores-chave.

Diagnóstico

  1. Examine todas as políticas de operações do mapa de valores-chave no proxy de API específico onde ocorreu a falha. Se existir alguma política de operações de mapa de chaves-valores em que o atributo mapIdentifier esteja definido como uma string vazia, essa é a causa do erro.

    Por exemplo, a seguinte política de operações de mapa de chave-valor tem um mapIdentifier vazio:

    <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>environment</Scope>
    </KeyValueMapOperations>
    

Resolução

Certifique-se de que o atributo mapIdentifier está definido como um mapa de valores-chave válido na Política de Operações de Mapa de Valores-chave.

Para corrigir a política de exemplo apresentada acima, pode especificar o mapIdentifier para um mapa de chaves-valores existente 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>environment</Scope>
</KeyValueMapOperations>

SetVariableFailed

Código de erro

steps.keyvaluemapoperations.SetVariableFailed

Corpo da resposta de erro

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

Exemplo de mensagem de erro

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

Causa

Este erro ocorre se tentar obter um valor de um mapa de valores-chave encriptado e definir o valor para uma variável cujo nome não tenha o prefixo private.. O prefixo, que é necessário para fins de segurança básicos durante a depuração, oculta os valores encriptados das sessões de depuração e rastreio do proxy de API.

Diagnóstico

1. Identifique a política de operações do mapa de valores-chave onde ocorreu o erro e o nome da variável à qual não é possível definir o valor. Pode encontrar ambos os itens no elemento faultstring da resposta de erro. Por exemplo, no seguinte faultstring, o nome da política é EncryptedKVM e a variável é myvar:

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

1. No XML da política de operações de mapa de chave-valor com falha, verifique se o nome da variável especificado no atributo assignTo do elemento <Get> corresponde ao nome da variável identificado na string de falha (passo n.º 1 acima). Por exemplo, a seguinte política de operações de mapeamento de chave-valor especifica uma variável denominada myvar no elemento <Get>, que corresponde ao que está em 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. Verifique se o mapa de chaves-valores especificado no atributo mapIdentifier é um KVM encriptado.

    Para verificar se um KVM está encriptado na IU do Apigee:

    1. Na IU do Apigee, clique em Administração no menu de navegação do lado esquerdo.
    2. Clique em Ambientes.
    3. Clique em Mapeamentos de chaves-valores.
    4. Encontre o mapa de valores-chave que quer usar.
    5. Clique na seta à esquerda do nome para expandir a lista de valores.
    6. Os mapas de chaves-valores encriptados apresentam valores ocultados com asteriscos na IU (*****) conforme mostrado no artigo Acerca dos KVMs encriptados.
  2. Se o mapa de valores-chave for um KVM encriptado e o nome da variável usado no atributo assignTo do elemento <Get> não tiver o prefixo private. Então, essa é a causa do erro.

    Na política de operações de mapa de chave-valor de exemplo apresentada acima, o mapa de chave-valor testEncrypted está encriptado e o nome da variável myvar não tem o prefixo private. Por isso, recebe o código de erro:

    steps.keyvaluemapoperations.SetVariableFailed
    

Resolução

Certifique-se de que o nome da variável tem o prefixo private. no atributo assignTo do elemento <Get> na política de operações de mapa de valores-chave se o mapa de valores-chave usado estiver encriptado.

Para corrigir a política de operações de mapa de chaves-valores de exemplo apresentada acima, pode modificar o valor do atributo assignTo para 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>