2013-05-17 30 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

相關問題