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

Você está visualizando a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

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>apiproxy</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>apiproxy</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. Se a KVM estiver criptografada no escopo do ambiente, será possível verificar se ela está criptografada na interface do Edge. Caso contrário, se ela foi criada no escopo da organização ou do apiproxy, use a API Management para verificar se ela está criptografada. Consulte também Como gerenciar e usar KVMs.

    Para verificar se uma KVM com escopo de ambiente está criptografada na interface do Edge:

    1. Na IU do Edge, 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 valores de exibição de chave-valor criptografados mascarados com asteriscos na IU (*****) são mostrados em Sobre as KVMs criptografadas.

    Para verificar se uma KVM com escopo no nível da organização, do ambiente ou do apiproxy é criptografada, use as APIs de gerenciamento. Se você usar a API, uma resposta de exemplo que mostra a configuração criptografada e os asteriscos do valor será assim:

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  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>