ECMA TypeError从Worklight适配器调用Java类

我已经看到了很多关于这个问题的问题,但没有确凿的答案。 我无法从Worklight适配器实现中调用Java类。 我用IBM Worklight Java Adapter教程中的代码替换了我的代码,它以完全相同的方式失败。 此外,我在IBM的网站上发现了一个回应,称Java 1.7编译器可能会导致此问题并使用Java 1.6。 我validation了Eclipse中的编译器是Java 1.6。

Eclipse和代码路径的屏幕截图

我的Java类都以com开头(例如com.worklight.customcode)。 我已经尝试过调用公共静态方法(使用正确的语法)以及实例化对象和调用方法。 如上所述,我还validation了我正在使用Java 1.6编译器。

以下是一些代码示例:

适配器实现文件:

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

Java文件(未经编辑的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; } } 

控制台出错:

TypeError:无法在对象[JavaPackage com.worklight.customcode.Calculator1]中调用属性addTwoIntegers。 它不是一个function,它是“对象”。 (%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapters%2Fadapter / adapter-impl.js#26)FWLSE0101E:引起:null

一些相关问题是:

  • Ecma错误:TypeError:无法调用属性
  • 我想从worklight适配器调用java类
  • https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014867695

我很接近,它本身不是CLASSPATH,而是(显然)Eclipse项目设置。

经过一周或更长时间的追逐,我编辑了.project文件,以包含我的项目没有的某些buildCommand标签。 将以下buildCommands添加到该部分允许我的代码在重新启动Eclipse后从JavaScript启动Java类。

   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     

.project文件位于Worklight项目主目录的根目录中(例如myproject / .project)。 我最终通过运行从JavaScript成功调用Java的工作项目来解决这个问题。

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

我将代码逐字复制到我的项目中,它与我的代码具有相同的行为。 我将我的代码复制到该项目,我的代码工作(!!)。 然后我比较了类路径,它们有些不同,但它没有改变行为。 我检查了.project文件,发现我的文件上面没有buildCommand标签。 相反,我的文件有许多externalToolBuilding标签,大概是因为我团队中的一个人使用的是Eclipse以外的IDE,而他的.project成为项目中的一个。 (我认为这是崇高的,如果重要的话)。

我不太了解每个标签的所有细节,或者究竟是如何以及为什么Worklight和Eclipse因为它而改变了它们的行为(或者它们为什么首先消失)。 但是,它使我的代码工作。 它只花了我一周的工作量(ack!)。

我希望将来可以帮助别人。

我们曾经多次遇到过这个问题而且它总是与一个损坏的eclipse .project文件有关。 会发生的是,您拥有的Java类没有构建,也没有添加到您的worklight.war文件中。 部署应用程序时,服务器上缺少已编译的类,ECMA错误以非常神秘的方式告诉您。

我们发现的一个解决方案是右键单击打开WL项目的属性,转到Java Build Path并使用那里的按钮向上和向下移动一些条目。 关闭属性对话框后,eclipse应该重写.project文件,构建应该可以工作。

我们有时做的另一件事是使用eclipse New-Class向导向项目的project / server / java部分添加一个新类,清理并重建项目,然后再次删除该类。 甚至可能在它使用的启动字符串末尾使用选项-clean启动eclipse。

首先让我们尝试确保它不是类型转换问题。 在Java代码中,使用两个对象参数定义Add函数:

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

查看服务器输出。 如果是类型问题,该方法现在应该工作。 否则,我们有一个不同的问题……

尽管尝试了上面提到的所有这些事情,但由于这个错误,我无法得到同样的例子。 我正在使用Eclipse 4.4,Worklight 6.2,WebSphere Application Server 8.5.5.1,Java 1.7。 我通过右键单击它并选择Run As> Invoke Worklight Procedure来运行适配器。

最后,我通过将生成的Adapters.war显式添加到项目构建路径来实现它。 从构建路径属性:添加JAR …> Adapters / bin / Adapters.war。 只有这样才开始工作。

即使我在新工作区上打开新项目,这个问题也经常发生在我身上。 我相信这里提出的解决方案并不涵盖所有情况,所以为了所有人的实用性,我在此列出了我找到的所有解决问题的可能解决方案:

1)检查正在运行的服务器的Java版本是否与项目相同,如此处所述。 我个人删除工作区属性中所有其他已安装的JRE。 我发现在某些情况下他们应该共享相同的次要版本,例如,如果服务器运行1.7.0,你不应该有1.7.49

2)检查工作空间的编译器合规性级别是否与服务器运行的java版本相同,如此处所述。 这是导致我最多麻烦的原因,因为这是我经常忘记的事情。

3)检查.project文件:如此处所述

4)通常有了这3个提示,我的问题就消失了,但为了完整起见,我还添加了一些可能有一定意义的提示

5)最后,您还需要从服务器中删除以前的“格式错误”应用程序并重建WAR