5

我已经看到了很多关于这个问题的问题,但没有确凿的答案。我无法从我的 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)
    };
}

Java 文件(未经编辑的 IBM Worklight 样本):包 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。它不是一个函数,它是“对象”。(%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapter%2Fadapter/adapter-impl.js#26) FWLSE0101E:原因:null

一些相关的问题是:

4

5 回答 5

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>

.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!)。

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

于 2013-05-26T17:31:29.617 回答
2

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

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

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

于 2013-09-24T19:29:21.817 回答
0

尽管尝试了上面提到的所有这些事情,但由于此错误,我无法使相同的示例正常工作。我正在使用 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。直到那时它才开始工作。

于 2014-08-12T06:14:52.343 回答
0

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

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

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

于 2013-05-20T11:27:25.680 回答
0

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

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

2) 检查工作区的编译器合规级别是否符合服务器运行的相同 java 版本,如此所述。这是给我带来最大麻烦的原因,因为这是我经常忘记的事情。

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

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

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

于 2018-01-10T11:32:02.810 回答