ECMA类型从Worklight适配器调用Java类时出错

ECMA类型从Worklight适配器调用Java类时出错,java,adapter,ibm-mobilefirst,Java,Adapter,Ibm Mobilefirst,我看到了很多关于这个问题的问题,但没有最终的答案。从Worklight适配器实现调用Java类时遇到问题。我用IBM Worklight Java适配器教程中的代码替换了我的代码,它以完全相同的方式失败。此外,我在IBM的网站上发现一条回复,说Java 1.7编译器可能会导致这个问题,所以我选择使用Java 1.6。我验证了我在Eclipse中的编译器是Java1.6 我的Java类都以com开头(例如com.worklight.customcode)。 我尝试了调用公共静态方法(使用正确的语

我看到了很多关于这个问题的问题,但没有最终的答案。从Worklight适配器实现调用Java类时遇到问题。我用IBM Worklight Java适配器教程中的代码替换了我的代码,它以完全相同的方式失败。此外,我在IBM的网站上发现一条回复,说Java 1.7编译器可能会导致这个问题,所以我选择使用Java 1.6。我验证了我在Eclipse中的编译器是Java1.6

我的Java类都以com开头(例如com.worklight.customcode)。 我尝试了调用公共静态方法(使用正确的语法)以及实例化对象和调用方法。如上所述,我还验证了我使用的是Java1.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]中调用属性AddTwoInteger com.worklight.customcode.Calculator1]。它不是一个函数,它是 “对象”。 (%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapters%2Fadapter/adapter impl.js#26) FWLSE0101E:原因:null

有关问题包括:


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

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

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

我很接近,这不是类路径本身,而是(显然)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>

org.eclipse.jdt.core.javabuilder

我将代码逐字复制到我的项目中,它的行为与我的代码相同。我把我的代码复制到那个项目中,我的代码成功了(!!)。然后我比较了类路径,它们有些不同,但没有改变行为。我检查了.project文件,发现我的文件没有上面的buildCommand标记。相反,我的文件中有许多externalToolBuilding标记,可能是因为我团队中的一个成员使用了Eclipse以外的IDE,他的.project成为了项目中的一个。(如果有关系的话,我认为这是崇高的)

我不太了解这些标记的所有细节,也不太清楚Worklight和Eclipse是如何以及为什么会因此改变它们的行为的(或者为什么它们一开始就消失了)。然而,它使我的代码工作。这只花了我一周的时间


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

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

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


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

尽管尝试了上面提到的所有方法,但由于这个错误,我无法让这个示例正常工作。我使用的是Eclipse4.4、Worklight6.2、WebSphereApplicationServer8.5.5.1、Java1.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

,谢谢Idan。我验证了将类型从int更改为Object没有任何区别。我得到了同样的错误。我强烈怀疑这是Eclipse/Worklight的类路径问题。另一个有趣的细节是,我的一位开发人员编写的代码(现在在我们的项目中已经过时)在他的机器上运行良好,但在我的机器上从未运行过。我刚刚意识到这是一个类似的问题。我无法通过JavaScript使任何Java类正常工作。在国际米兰