Solução de problemas de erros em ambiente de execução de operações de mapa de chave-valor

Esta é a documentação da Apigee e da Apigee híbrida.
Confira a documentação da Apigee Edge.

UnsupportedOperationException

Código do erro

java.lang.UnsupportedOperationException

Corpo da resposta de erro

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

Causa

Esse erro ocorrerá se o atributo mapIdentifier estiver definido como string vazia na política de operações do mapa de valor de chave.

Diagnóstico

  1. Examine todas as políticas de operações de mapas de chave-valor no proxy de API específico em que a falha ocorreu. Se houver alguma política de operações de mapa de chave-valor 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

Verifique se o atributo mapIdentifier está definido como um mapa de chave-valor válido na política de operações do Mapa de chave-valor.

Para corrigir a política de exemplo mostrada acima, especifique mapIdentifier para um mapa de chave-valor atual 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 do 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 você tentar recuperar um valor de um mapa de valores de chave criptografado e definir o valor como uma variável que não tenha o prefixo private.. O prefixo, que é necessário para fins básicos de segurança durante a depuração, oculta os valores criptografados das sessões de trace e depuração do proxy de API.

Diagnóstico

1. Identifique a política de operações de mapeamento de valor-chave em que o erro ocorreu e o nome da variável para a qual o valor não pode ser definido. É possível encontrar os dois itens no elemento faultstring da resposta de erro. Por exemplo, no faultstring a seguir, o nome da política é EncryptedKVM e a variável é myvar:

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

1. Na política XML de operações do mapa de chave-valor, confirme se o nome da variável especificada no atributo assignTo do elemento <Get> corresponde ao nome da variável identificado na string com falha (etapa 1 acima). Por exemplo, a seguinte política de operações de mapa de chave-valor especifica uma variável chamada 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 chave-valor especificado no atributo mapIdentifier é uma KVM criptografada.

    Para verificar se uma KVM está criptografada na IU da Apigee:

    1. Na IU da Apigee, clique em Admin no menu de navegação à esquerda.
    2. Clique em Ambientes.
    3. Clique em Mapas de chave-valor.
    4. Encontre o Mapa de chave-valor que você quer usar.
    5. Clique na seta à esquerda do nome para expandir a lista de valores.
    6. Os mapas de chave-valor criptografados mostram valores mascarados com asteriscos na IU (*****), conforme mostrado em Sobre as KVMs criptografadas.
  2. Se o mapa de chave-valor for uma KVM criptografada e o nome da variável usado no atributo assignTo do elemento <Get> não tiver o prefixo private essa será a causa do erro.

    No exemplo de política de operações de mapa de chave-valor mostrado acima, o mapa de chave-valor testEncrypted é criptografado e o nome da variável myvar não tem o prefixo private. Portanto, você receberá o código do erro:

    steps.keyvaluemapoperations.SetVariableFailed
    

Resolução

Certifique-se de que o nome da variável tenha o prefixo private. no atributo assignTo do elemento <Get> na política de operações de mapeamento de valor-chave se o mapa de chave-valor usado for criptografado.

Para corrigir o exemplo de política de operações de mapeamento de valor-chave mostrado acima, você 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>