Classe de chamada ECMA TypeError chamando a partir do adaptador Worklight

Eu vi uma série de perguntas sobre esta questão, mas sem respostas conclusivas. Estou tendo problemas para chamar uma class Java da implementação do adaptador Worklight. Eu substituí meu código com o código do tutorial do IBM Worklight Java Adapter e ele falha da mesma maneira. Além disso, encontrei uma resposta no site da IBM dizendo que o compilador Java 1.7 poderia causar esse problema e usar o Java 1.6. Eu validei que meu compilador no Eclipse é o Java 1.6.

Captura de tela do Eclipse e do caminho do código

Todas as minhas classs Java começam com (por exemplo, com.worklight.customcode). Eu tentei ambos chamando methods estáticos públicos (usando a syntax adequada), bem como instanciando o object e chamando o método. Como mencionado acima, eu também validei que estou usando o compilador Java 1.6.

Aqui estão algumas amostras de código:

Arquivo de implementação do adaptador:

function addTwoIntegers(a,b){ return { result: com.worklight.customcode.Calculator1.addTwoIntegers(a,b) }; } 

Arquivo Java (amostra não editada do IBM Worklight): package com.worklight.customcode;

 import java.util.logging.Logger; public class Calculator1 { private final static Logger logger = Logger.getLogger(Calculator1.class.getName()); public static int addTwoIntegers(int first, int second){ logger.info("addTwoIntegers invoked"); return first + second; } public int subtractTwoIntegers(int first, int second){ logger.info("subtractTwoIntegers invoked"); return first - second; } } 

Erro no console:

TypeError: Não é possível chamar a propriedade addTwoIntegers no object [JavaPackage com.worklight.customcode.Calculator1]. Não é uma function, é “object”. (% 2FUsers% 2Fhome% 2Fdev% 2Fapp% 2Fappprj% 2Fadapters% 2Fadapter / adapter-impl.js # 26) FWLSE0101E: Causado por: null

Algumas das questões relacionadas são:

  • Erro Ecma: TypeError: não é possível chamar a propriedade
  • Eu quero chamar uma class java do adaptador worklight
  • https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014867695

Eu estava perto, não era CLASSPATH per se, mas sim (aparentemente) as configurações do projeto Eclipse.

Depois de uma semana ou mais disso, editei o arquivo .project para include certas tags buildCommand que meu projeto não tinha. Incluir os seguintes buildCommands na seção permitiu que meu código iniciasse classs Java a partir do JavaScript depois de reiniciar o Eclipse.

   org.eclipse.jdt.core.javabuilder     org.eclipse.wst.jsdt.core.javascriptValidator     org.eclipse.wst.common.project.facet.core.builder     com.worklight.studio.plugin.WorklightProjectBuilder     org.eclipse.wst.validation.validationbuilder     

O arquivo .project está localizado na raiz da página inicial do projeto Worklight (por exemplo, myproject / .project). Eu descobri isso eventualmente, ao executar um projeto de trabalho que chamava Java com êxito do JavaScript.

Consulte http://www.ibm.com/developerworks/rational/library/server-side-mobile-application-development-1/

Copiei o código literalmente para o meu projeto e ele teve o mesmo comportamento do meu código. Copiei meu código para esse projeto e meu código funcionou (!!). Então comparei os caminhos de class, que eram um pouco diferentes, mas isso não alterou o comportamento. Eu inspecionei o arquivo .project e percebi que meu arquivo não tinha as tags buildCommand acima. Em vez disso, meu arquivo tinha um número de tags externalToolBuilding, presumivelmente porque um dos caras da minha equipe usa um IDE diferente do Eclipse e seu .project se tornou o único no projeto. (Eu acho que é Sublime, se importa).

Eu não entendo muito bem todos os detalhes do que cada uma dessas tags faz ou exatamente como e por que o Worklight e o Eclipse mudam seu comportamento por causa disso (ou por que eles desapareceram em primeiro lugar). No entanto, isso fez meu código funcionar. Só me custou uma semana de trabalho (ack!).

Espero que isso ajude alguém no futuro.

nós tivemos esse problema várias vezes e sempre teve algo a ver com um arquivo .project do eclipse corrompido. O que acontece é que a class Java que você possui não é construída e não é adicionada ao seu arquivo worklight.war. Quando você implanta seu aplicativo, a class compilada está faltando no servidor e o erro ECMA informa isso de uma maneira muito críptica.

Uma solução encontrada foi abrir as propriedades do projeto WL com um clique no botão direito do mouse para o Java Build Path e mover algumas das inputs UP e DOWN usando os botões. Depois de fechar o diálogo de propriedades, o eclipse deve rewrite o arquivo .project e o build deve funcionar.

Outra coisa que fizemos algumas vezes foi adicionar uma nova class à parte de projeto / servidor / java do projeto usando o assistente eclipse New-Class, limpar e reconstruir o projeto e, em seguida, remover a class novamente. Talvez até inicie o eclipse com a opção -clean no final da string de boot que ele usa.

Primeiro, vamos tentar garantir que não seja um problema de conversão de tipo. Em seu código Java, defina a function Add com dois parâmetros de object:

 public static int addTwoIntegers(Object first, Object second) { logger.info("addTwoIntegers invoked" + first.getClass() + "," + second.getClass()); return first + second; } 

Olhe para a saída do servidor. Se fosse um problema de tipo, o método agora deveria funcionar. Caso contrário, temos um problema diferente …

Eu não pude obter este mesmo exemplo trabalhando por causa desse erro, apesar de tentar todas essas coisas mencionadas acima. Estou usando o Eclipse 4.4, Worklight 6.2, o WebSphere Application Server 8.5.5.1, Java 1.7. Eu estava executando o adaptador clicando com o botão direito e selecionando Executar como> Invoke Worklight Procedure.

No final, consegui trabalhar explicitamente adicionando o Adapters.war gerado ao caminho de construção do projeto. A partir das propriedades do caminho de construção: Incluir JARs …> Adaptadores / bin / Adapters.war. Só então começou a funcionar.

Esse problema muitas vezes acontece comigo mesmo quando abro novos projetos em novos espaços de trabalho. Acredito que as soluções aqui propostas não cobrem todos os casos, portanto, para a utilidade de todos, listo aqui todas as soluções possíveis que encontrei para resolver o problema:

1) verifique se a versão Java do servidor em execução é a mesma do projeto, conforme mencionado aqui . Eu pessoalmente remover todos os outros JRE instalados nas propriedades do espaço de trabalho. Descobri que, em alguns casos, eles devem compartilhar também a mesma versão secundária, por exemplo, se o servidor executa o 1.7.0 você não deve ter o 1.7.49

2) verifique se também o nível de conformidade do compilador da área de trabalho se ajusta à mesma versão java executada pelo servidor, conforme mencionado aqui . Isso é o que me causa mais problemas, já que é algo que esqueci com frequência.

3) verifique o arquivo .project : como mencionado aqui

4) Geralmente com essa 3 dica meus problemas se foram, mas por uma questão de completude eu adicionei também essa dica que poderia ter algum sentido

5) finalmente, você também pode precisar remover o aplicativo “malformado” anterior do servidor e reconstruir o WAR

Intereting Posts