2013-05-17 85 views
5

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

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

爪哇文件(未编辑的IBM工作灯样品): 包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: Cannot call property addTwoIntegers in object [JavaPackage com.worklight.customcode.Calculator1]. It is not a function, it is "object". (%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapters%2Fadapter/adapter-impl.js#26) FWLSE0101E: Caused by: null

一些相关的问题是:

回答

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标签,可能是因为我的团队中有一个人使用IDE以外的IDE,他的项目成为项目中的一员。 (我认为它是崇高的,如果它很重要)。

我不太明白什么这些标签做的所有细节或究竟如何以及为什么工作灯和Eclipse改变,因为它(或者他们为什么摆在首位消失),他们的行为。但是,它使我的代码工作。它只花了我一周的工作(ack!)。

我希望这可以帮助别人在未来。

0

首先让我们尝试确保它不是类型转换问题。在Java代码中定义添加功能有两个对象参数:

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

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

+0

谢谢Idan。我确认将类型从int更改为Object没有任何区别。我犯了同样的错误。 – user2217751

+0

我强烈怀疑这是Eclipse/Worklight中的类路径问题。另一个有趣的细节是,我的开发人员工作的代码(在我们的项目中已经过时)在他的机器上工作良好,但从未在我的机器上工作。我刚刚意识到这是一个类似的问题。我无法让任何Java类从JavaScript正常工作。在关于这个问题的互联网上搜索时,它看起来与类路径(或类似的配置问题)非常相似,它可以在一个人的机器上工作,而在另一个人的机器上工作而不在另一个人的机器上。有关在WL中检查配置的任何提示?我明显检查了类路径。 – user2217751

+0

这里有一个链接到另一个似乎相关的问题(和未解决):http://stackoverflow.com/questions/15826456/ecma-error-typeerror-cannot-call-property?rq=1 – user2217751

2

我们有这个问题好几次,它总是有一些东西需要与损坏的日食项目文件。会发生什么情况是,您所拥有的Java类不会构建,并且不会添加到您的worklight.war文件中。当您部署应用程序时,服务器上缺少已编译的类,并且ECMA错误以非常神秘的方式告诉您。

一个解决方案,我们发现是用右键点击打开WL项目的属性去Java构建路径和移动一些条目和使用的按钮有DOWN。在关闭属性对话框后,eclipse应该重写.project文件,并且构建应该可以工作。

我们有时候做的另一件事是使用Eclipse新-Class向导,干净的新类添加到项目的项目/服务器/ Java的一部分,重建项目,然后再删除类。也许甚至可以在启动字符串的末尾使用选项-clean启动eclipse。

+0

谢谢,对我来说,它创造一个解决问题的临时Java类。 –

0

尽管尝试了上面提到的所有这些事情,但由于此错误,我无法得到此相同的示例。我使用Eclipse 4.4,Worklight 6.2,WebSphere Application Server 8.5.5.1,Java 1.7。我正在通过右键单击适配器并选择“运行方式”>“调用Worklight过程”来运行适配器。

最后,我把它通过明确将产生的Adapters.war到项目的构建路径工作。从构建路径属性:添加JAR ...> Adapters/bin/Adapters.war。才开始工作。

0

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

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

2)检查也是工作区的编译器遵从性级别适合服务器运行的相同Java版本,如here所述。这是我最麻烦的事情,因为这是我经常忘记的事情。

3)检查.project文件:提到here

4)通常与该3暗示我的问题都消失了,但为了完整起见,我还加this hint可能有一定的道理

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

相关问题