ECMA TypeError从Worklight适配器调用Java类

use*_*751 5 java adapter ibm-mobilefirst

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

Eclipse和代码路径的屏幕截图

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

以下是一些代码示例:

适配器实现文件:

function addTwoIntegers(a,b){
    return {
        result: com.worklight.customcode.Calculator1.addTwoIntegers(a,b)
    };
}
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

控制台出错:

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

一些相关问题是:

use*_*751 2

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

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

<buildSpec>
    <buildCommand>
        <name>org.eclipse.jdt.core.javabuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.wst.common.project.facet.core.builder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>com.worklight.studio.plugin.WorklightProjectBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.wst.validation.validationbuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
</buildSpec>
Run Code Online (Sandbox Code Playgroud)

.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 如何以及为何因此而改变其行为(或者为什么它们一开始就消失了)。然而,它使我的代码工作了。它只花费了我一周的工作量(确认!)。

我希望这对将来的其他人有帮助。