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