I've seen a number of questions about this issue but no conclusive answers. I am having trouble calling a Java class from my Worklight adapter implementation. I replaced my code with the code from the IBM Worklight Java Adapter tutorial and it fails in the exact same way. Furthermore I found a response on IBM's site saying the Java 1.7 compiler might cause this problem and to use Java 1.6 instead. I validated that my compiler in Eclipse is Java 1.6.
My Java classes all begin with com (e.g. com.worklight.customcode).
I've tried both calling public static methods (using the proper syntax) as well as instantiating the object and calling the method. As mentioned above, I've also validated I'm using the Java 1.6 compiler.
Here are some code samples:
Adapter implementation file:
function addTwoIntegers(a,b){
return {
result: com.worklight.customcode.Calculator1.addTwoIntegers(a,b)
};
}
Java file (unedited IBM Worklight sample):
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;
}
}
Error in the console:
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
Some of the related questions are:
- Ecma Error: TypeError: Cannot call property
- i want to call a java class from the worklight adapter
- https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014867695
我很接近,这不是CLASSPATH本身,而是(显然)Eclipse项目的设置。
经过一个星期或更多追逐这一关,并,我编辑的项目文件,包括我的计划没有一定buildCommand标签。 添加以下buildCommands到部分允许我的代码从JavaScript。重新启动Eclipse之后推出的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>
该项目文件位于工作灯项目主页的根目录(例如,MyProject的/。工程)。 我终于想通了这一点,通过在一个工作项目,并成功地调用Java在JavaScript中运行。
见http://www.ibm.com/developerworks/rational/library/server-side-mobile-application-development-1/
我逐字复制的代码到我的项目和它有相同的行为,我的代码。 我复制我的代码到该项目,我的代码工作(!!)。 然后我比较了类路径,这是有些不同,但它并没有改变行为。 我检查了项目文件,发现我的文件不具有上述buildCommand标签。 相反,我的档案有一些externalToolBuilding标签,大概是因为在我的球队里的朋友使用比其他的Eclipse的IDE和他的.project成为一个项目。 (我认为这是崇高的,如果它事项)。
我不太明白什么这些标签做的所有细节或正好工作灯和Eclipse如何以及为什么改变,因为它(或者他们为什么摆在首位消失),他们的行为。 然而,它使我的代码工作。 我只花了一个星期的工作(ACK!)。
我希望这可以帮助别人,将来别人。
我们有这个问题好几次,它总是有一些东西需要与损坏的日食项目文件。 什么情况是,Java类你没有得到构建,它不会被添加到您的worklight.war文件。 当你部署应用程序,已编译的类缺少服务器和ECMA错误告诉你,在一个非常隐蔽的方式。
我们发现一个解决方案是用右键点击打开WL项目的属性去Java构建路径和移动一些条目和使用的按钮有DOWN。 关闭属性对话框后,日食应该重写项目文件和构建应该工作。
我们有时会做的另一件事是使用Eclipse新-Class向导,干净的新类添加到项目的项目/服务器/ Java的一部分,重建项目,然后再删除类。 也许甚至开始与它使用的启动字符串的结尾-clean选项蚀。
首先让我们尝试以确保它不是一个类型转换的问题。 在Java代码中定义了两个对象参数添加功能:
public static int addTwoIntegers(Object first, Object second) {
logger.info("addTwoIntegers invoked" + first.getClass() + "," + second.getClass());
return first + second;
}
看看服务器的输出。 如果这是一个类型的问题,该方法现在应该工作。 否则,我们有一个不同的问题...
我无法得到同样的例子,工作,因为这个错误,尽管尝试上述所有这些事情。 我使用Eclipse 4.4,工作灯6.2,WebSphere应用服务器8.5.5.1,爪哇1.7。 我是通过右键单击它并选择Run As>调用工作灯程序运行适配器。
最后,我把它通过明确将产生的Adapters.war到项目的构建路径工作。 从构建路径属性:添加JAR文件...>适配器/斌/ Adapters.war。 只有到那时它开始工作。
这个问题经常发生在我身上,甚至当我打开新的工作区的新项目。 我认为,这里提出的解决方案并没有覆盖所有的情况,所以对于所有的用处,我在这里列出所有可能的解决方案,我发现要解决的问题:
1)检查正在运行的服务器的Java版本是相同的项目,如提及这里 。 我个人删除所有其他已安装JRE在工作区的属性。 我发现,在某些情况下,他们应该在服务器运行1.7.0你不应该有49年7月1日也有着相同的次要版本,例如
2)检查也是工作区的编译器遵从性级别适合在服务器上运行相同的Java版本,提到这里 。 这是什么原因造成了我最烦恼的,因为它是什么,我忘了经常。
3)检查.project
文件:提到这里
4)通常与该3暗示我的问题都消失了,但为了完整起见,我还加这暗示 ,可能有一定的道理
5)最后,您还可以根据需要从服务器中删除以前的“畸形”的应用和重建WAR