ECMA TypeError从Worklight适配器调用Java类

时间:2013-05-17 17:23:00

标签: java adapter ibm-mobilefirst

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

Screenshot of Eclipse and code path

我的Java类都以com开头(例如com.worklight.customcode)。 我已经尝试过调用公共静态方法(使用正确的语法)以及实例化对象和调用方法。如上所述,我还验证了我正在使用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中调用属性addTwoIntegers   com.worklight.customcode.Calculator1。它不是一个功能   “宾语”。   (%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapters%2Fadapter /适配器-impl.js#26)       FWLSE0101E:引起:null

一些相关问题是:

5 个答案:

答案 0 :(得分: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成为项目中的一个。 (我认为这是Sublime,如果重要的话)。

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

3)检查.project文件:如上所述here

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

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