Resolução de problemas de erros de implementação da política JavaCallout

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

ResourceDoesNotExist

Mensagem de erro

A implementação do proxy de API através da IU ou da API Apigee falha com esta mensagem de erro:

Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.

Exemplo de mensagem de erro

Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.

Captura de ecrã de erro de exemplo

Erro ao implementar a revisão 1 para teste.

Causa

Se o recurso especificado no elemento <ResourceURL> na política JavaCallout não existir ao nível do proxy de API ou do ambiente, a implementação do proxy de API falha.

Diagnóstico

  1. Identifique o ambiente e o nome do recurso. Pode encontrar estas informações na mensagem de erro. Por exemplo, no seguinte erro, o ambiente é test e o nome do recurso usado no elemento <ResourceURL> é myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Determine a política JavaCallout que está a usar o recurso identificado no passo n.º 1 acima.

    Por exemplo, a seguinte política especifica o valor de <ResourceURL> como myresource.jar, que corresponde ao valor na mensagem de erro:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JavaCallout name="hello-java">
        <ClassName>com.apigeesample.HelloJava</ClassName>
        <ResourceURL>java://myresource.jar</ResourceURL>
    </JavaCallout>
    
  3. Determine se o recurso faz parte do proxy de API com falhas ou se foi carregado ao nível do ambiente. Caso contrário, esta é a causa do erro.

    • Navegue para o separador Recursos no painel de navegação do editor de proxy de API para ver todos os recursos carregados ao nível do proxy de API. Neste exemplo, o proxy de API não tem recursos carregados.

      Separador Resources do editor de proxy de API no painel Navigator.

    • Os recursos podem estar disponíveis ao nível do ambiente. Para mais informações, consulte o artigo Ficheiros de recursos.

      • Para determinar se o recurso existe ao nível do ambiente, emita a seguinte chamada da API através do curl:

        curl \
        "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \
        -H "Authorization: Bearer $TOKEN"

        Onde $TOKEN está definido como a sua chave de acesso OAuth 2.0, conforme descrito em Obter uma chave de acesso OAuth 2.0. Para informações sobre as opções de curl usadas neste exemplo, consulte a secção Usar o curl. Para uma descrição das variáveis de ambiente que pode usar, consulte o artigo Definir variáveis de ambiente para pedidos de API Apigee.

      Se receber um código de estado 404 como resposta para estas APIs, significa que o recurso está em falta ao nível do ambiente.

    Se o recurso não estiver disponível ao nível do proxy de API e do ambiente, é devolvido o erro de implementação:

    Resource with name myresource.jar and type java does not exist.
     ```
    

Resolução

Certifique-se de que o recurso especificado no elemento <ResourceURL> existe ao nível do proxy de API ou do ambiente. Para mais informações, consulte o artigo Gerir recursos.

Para corrigir a política JavaCallout de exemplo apresentada acima, carregue o ficheiro JAR no nível adequado (proxy de API ou nível do ambiente).

NoResourceForURL

Mensagem de erro

A implementação do proxy de API através da IU ou da API Apigee falha com esta mensagem de erro:

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL <var>ResourceURL</var>

Exemplo de mensagem de erro

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar

Captura de ecrã de erro de exemplo

Erro na implementação para o teste do ambiente.

Causa

Este erro pode ocorrer se o ficheiro de recursos estiver danificado ou tiver sido carregado parcialmente, mesmo que pareça existir ao nível do proxy de API ou do ambiente.

Diagnóstico

  1. Identifique o ambiente e o nome do recurso. Pode encontrar estas informações na mensagem de erro. Por exemplo, no seguinte erro, o nome do ambiente é test e o nome do recurso usado no elemento <ResourceURL> é myresource.jar.

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
    
  2. Certifique-se de que o recurso é carregado ao nível do proxy de API ou do ambiente. No exemplo abaixo, pode ver que o recurso myresource.jar é carregado ao nível do proxy da API.

    Recursos de proxy de API.

    Os recursos podem estar disponíveis ao nível do ambiente. Para mais informações, consulte o artigo Ficheiros de recursos.

    Para determinar se o recurso existe ao nível do ambiente, emita a seguinte chamada da API através do curl:

    curl \
    "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \
    -H "Authorization: Bearer $TOKEN"

    Em que $TOKEN está definido como a sua chave de acesso OAuth 2.0, conforme descrito em Obter uma chave de acesso OAuth 2.0. Para informações sobre as opções curl usadas neste exemplo, consulte o artigo Usar o curl.

    Se receber um código de estado 404 como resposta para estas APIs, significa que o recurso está em falta ao nível do ambiente.

Resolução

  1. Se determinar que o recurso existe ao nível do proxy de API ou do ambiente, elimine o recurso e carregue-o novamente, conforme descrito no passo 2. Caso contrário, avance para o passo 3.
  2. Para eliminar o recurso ao nível do proxy de API, navegue para o separador Recursos no painel de navegação do editor de proxy de API e clique no botão "X" junto ao recurso, conforme mostrado abaixo.

    Para eliminar o recurso ao nível do proxy de API, clique em Eliminar.

    Para eliminar o recurso no ambiente, use o verbo DELETE nas chamadas API que foram usadas anteriormente nos passos de diagnóstico. Por exemplo, para eliminar o recurso ao nível do ambiente, introduza o seguinte comando:

    curl -X DELETE \
    "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \
    -H "Authorization: Bearer $TOKEN"

    Em que $TOKEN está definido como a sua chave de acesso OAuth 2.0, conforme descrito em Obter uma chave de acesso OAuth 2.0. Para informações sobre as opções curl usadas neste exemplo, consulte o artigo Usar o curl.

  3. Carregue o ficheiro JAR) no nível adequado (proxy de API ou nível de ambiente).

  4. Se o novo carregamento do recurso não ajudar, contacte o apoio técnico do Apigee.

JavaCalloutInstantiationFailed

Mensagem de erro

A implementação do proxy de API através da IU ou da API Apigee falha com esta mensagem de erro:

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class <var>class_name</var>

Ou

Error in deployment for environment <var>environment</var>.
The revision is deployed and traffic can flow, but flow may be impaired. Failed to instantiate the JavaCallout Class <var>class_name</var>

Exemplo de mensagem de erro

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class

Captura de ecrã de erro de exemplo

Erro na implementação para o teste do ambiente.

Causa

Seguem-se as causas típicas deste erro

Causa Descrição
Ficheiro JAR em falta O ficheiro JAR que contém a classe Java identificada no erro não é carregado.
Ficheiro JAR danificado O ficheiro JAR que contém a classe Java identificada no erro está danificado/foi carregado parcialmente.
Ficheiro de aula em falta O ficheiro de classe Java identificado no erro não faz parte do ficheiro JAR especificado em >ResourceURL< ou ficheiros JAR dependentes.
Problema de código Java Existe um erro no código, como um construtor em falta, um problema de dependência do código ou outro problema.

Passo de diagnóstico comum

  1. Identifique o nome do ambiente e da turma cuja importação falhou. Por exemplo, na seguinte mensagem de erro, o nome do ambiente é test e o nome da classe é my.class:

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
    
    

Causa: ficheiro JAR em falta

Diagnóstico

  1. Determine o ficheiro JAR que deve conter a classe (identificada no passo n.º 1 acima) e que não foi possível instanciar.
  2. Verifique se o ficheiro JAR específico é carregado ao nível do ambiente ou do proxy da API. Se o ficheiro JAR não for carregado a nenhum dos níveis, aceda à Resolução.
  3. Se o ficheiro JAR for carregado, aceda a Causa: ficheiro JAR danificado.

Resolução

  1. Se o ficheiro JAR estiver danificado ou tiver sido carregado parcialmente, recompile o JAR e carregue o ficheiro JAR no nível adequado (proxy de API ou nível de ambiente).
  2. Volte a implementar o proxy de API.

Causa: ficheiro JAR danificado

Diagnóstico

  1. Determine o ficheiro JAR que deve conter a classe (identificada no passo n.º 1 acima) que não foi possível instanciar.
  2. Verifique se o ficheiro JAR específico está danificado. Por exemplo, se não conseguir descompactar o ficheiro porque está corrompido ou foi carregado parcialmente. Se estiver danificado, aceda à Resolução.
  3. Se o ficheiro JAR não estiver corrompido, aceda a Causa: ficheiro de classe em falta.

Resolução

  1. Recompile os ficheiros JAR danificados e carregue o ficheiro JAR no nível adequado (proxy de API ou nível do ambiente).
  2. Volte a implementar o proxy de API.

Causa: ficheiro de classe em falta

Diagnóstico

  1. Verifique se o ficheiro de classe Java específico (identificado no passo n.º 1 acima) faz parte do ficheiro JAR especificado em >ResourceURL< ou de qualquer um dos ficheiros JAR dependentes.
  2. Se o ficheiro da classe não existir em nenhum dos ficheiros JAR, determinou a causa do erro. Aceda à resolução.
  3. Se o ficheiro de classe existir num dos ficheiros JAR especificados na política JavaCallout, tem de haver um problema com o código Java ou a classe dependente que está a originar este erro. Para obter ajuda, contacte o apoio técnico do Apigee.

Resolução

  1. Recompile o JAR com os ficheiros de classe em falta e carregue o ficheiro JAR no nível adequado (proxy de API ou nível do ambiente).
  2. Volte a implementar o proxy de API.

Carregue o ficheiro JAR

Certifique-se de que o elemento de recurso com todas as classes necessárias existe ao nível do proxy de API ou do ambiente. Para mais informações, consulte o artigo Ficheiros de recursos.

  1. Para carregar um recurso ao nível do proxy de API, clique em + (sinal de mais) no separador Resources (Recursos), selecione Import file (Importar ficheiro) e carregue o ficheiro a partir do seu computador local. O nome do ficheiro deve corresponder ao elemento >ResourceURL<, mas sem o prefixo java://.

    No separador Recursos, selecione Importar ficheiro.

  2. Se quiser que um recurso esteja disponível para mais do que um proxy de API no mesmo ambiente, carregue o recurso para o ambiente. Tem de usar a API Apigee, conforme descrito em Ficheiros de recursos.

    Por exemplo, introduza a seguinte chamada API a partir da máquina local para carregar o ficheiro especificado ao nível do ambiente:

    curl -H "Content-Type: application/octet-stream" \
    -X POST  -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \
    "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles?name=myresouce.jar&type=java"

    Em que $TOKEN está definido como a sua chave de acesso OAuth 2.0, conforme descrito em Obter uma chave de acesso OAuth 2.0. Para informações sobre as opções curl usadas neste exemplo, consulte o artigo Usar o curl.

    Emita a chamada API a partir do mesmo diretório que o ficheiro.

  3. Para disponibilizar o ficheiro a todos os proxies de API em todos os ambientes da organização, pode omitir os detalhes do ambiente no caminho base. Por exemplo:

    curl -H "Content-Type: application/octet-stream" \
    -X POST  -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \
    "https://apigee.googleapis.com/v1/organizations/$ORG/resourcefiles?name=myresouce.jar&type=java"

    Em que $TOKEN está definido como a sua chave de acesso OAuth 2.0, conforme descrito em Obter uma chave de acesso OAuth 2.0. Para informações sobre as opções curl usadas neste exemplo, consulte o artigo Usar o curl.