2013-05-17 9 views
5

Ich habe eine Reihe von Fragen zu diesem Problem, aber keine schlüssigen Antworten gesehen. Ich habe Probleme beim Aufruf einer Java-Klasse von meiner Worklight-Adapterimplementierung. Ich habe meinen Code durch den Code aus dem IBM Worklight Java Adapter-Lernprogramm ersetzt und schlägt genau so fehl. Außerdem habe ich auf der IBM Seite eine Antwort gefunden, die besagt, dass der Java 1.7 Compiler dieses Problem verursachen könnte und stattdessen Java 1.6 verwendet. Ich habe bestätigt, dass mein Compiler in Eclipse Java 1.6 ist.ECMA TypeError Java-Klasse von Worklight-Adapter aufrufen

Screenshot of Eclipse and code path

Meine Java-Klassen beginnen alle mit com (z com.worklight.customcode). Ich habe versucht, sowohl öffentliche statische Methoden (mit der richtigen Syntax) aufrufen, als auch das Objekt instanziieren und die Methode aufrufen. Wie oben erwähnt, habe ich auch bestätigt, dass ich den Java 1.6 Compiler verwende.

Hier sind einige Code-Beispiele:

Adapter Implementierungsdatei:

function addTwoIntegers(a,b){ 
    return { 
     result: com.worklight.customcode.Calculator1.addTwoIntegers(a,b) 
    }; 
} 

Java-Datei (ungeschnittene IBM Worklight Probe): Paket 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; 
    } 

} 

Fehler in der Konsole:

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

Einige der damit verbundenen Fragen sind:

Antwort

2

Ich war nah dran, es war kein CLASSPATH per se, sondern eher (scheinbar) Eclipse-Projekteinstellungen.

Nach einer Woche oder mehr, diese aus und wieder zu verfolgen, habe ich die .Project-Datei bearbeitet, um bestimmte BuildCommand-Tags, die mein Projekt nicht hatte. Durch das Hinzufügen der folgenden buildCommands zum Abschnitt konnte mein Code nach dem Neustart von Eclipse Java-Klassen von JavaScript aus starten.

<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> 

Die .project Datei in der Wurzel des Arbeitsscheinwerfer Projekt Hauses befindet (z.B. myproject/.project). Ich habe das irgendwann herausgefunden, indem ich ein funktionierendes Projekt durchgelaufen bin, das Java erfolgreich aus JavaScript aufgerufen hat.

Siehe http://www.ibm.com/developerworks/rational/library/server-side-mobile-application-development-1/

ich den Code wörtlich mein Projekt kopiert und es hatte das gleiche Verhalten wie mein Code. Ich habe meinen Code in dieses Projekt kopiert und mein Code hat funktioniert (!!). Ich habe dann die Klassenpfade verglichen, die etwas anders waren, aber es hat das Verhalten nicht verändert. Ich habe die .project-Datei untersucht und festgestellt, dass meine Datei die obigen buildCommand-Tags nicht enthält.Stattdessen hatte meine Datei eine Reihe von externalToolBuilding -Tags, vermutlich weil einer der Jungs in meinem Team eine andere IDE als Eclipse verwendet und sein .project derjenige im Projekt wurde. (Ich denke, es ist erhaben, wenn es darauf ankommt).

Ich verstehe nicht alle Details, was jede dieser Tags oder genau wie und warum Worklight und Eclipse ihr Verhalten ändern (oder warum sie in erster Linie verschwunden sind). Allerdings hat es meinen Code funktioniert. Es kostete mich nur eine Woche Arbeit (ack!).

Ich hoffe, dass dies jemand anderen in der Zukunft hilft.

0

Lassen Sie uns zunächst sicherstellen, dass es sich nicht um ein Konvertierungsproblem handelt. In Java-Code definieren die Add-Funktion mit zwei Objektparameter:

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

Blick auf den Server ausgegeben. Wenn es sich um ein Type-Problem handelte, sollte die Methode jetzt funktionieren. Ansonsten haben wir ein anderes Problem ...

+0

Dank Idan neu erstellen. Ich habe festgestellt, dass das Ändern des Typs von int in Object keinen Unterschied machte. Ich bekomme den gleichen Fehler. – user2217751

+0

Ich vermute stark, dass dies ein Klassenpfadproblem mit Eclipse/Worklight ist. Ein weiteres interessantes Detail ist, dass der Code, den einer meiner Entwickler hatte (der in unserem Projekt jetzt veraltet ist), auf seiner Maschine gut funktioniert hat, aber nie auf meiner. Ich habe gerade festgestellt, dass es sich um ein ähnliches Problem handelt. Ich kann keine Java-Klassen richtig von JavaScript funktionieren. Wenn Sie das Internet nach diesem Problem durchsuchen, sieht es sehr ähnlich aus wie ein Klassenpfad (oder ein ähnliches Konfigurationsproblem), wo es auf dem Computer einer Person funktioniert, aber nicht auf dem eines anderen Computers. Irgendwelche Tipps, wo die Konfiguration in WL zu überprüfen? Ich habe offensichtlich den Klassenpfad überprüft. – user2217751

+0

Hier ist ein Link zu einer anderen Frage, die verwandt scheint (und ungelöst): http://stackoverflow.com/questions/15826456/ecma-error-typeerror-cannot-call-property?rq=1 – user2217751

2

hatten wir dieses Problem mehrmals und es hatte immer etwas mit einer beschädigten Eclipse .Project-Datei zu tun. Was passiert, ist, dass die Java-Klasse, die Sie haben, nicht erstellt wird und nicht zu Ihrer worklight.war-Datei hinzugefügt wird. Wenn Sie Ihre App bereitstellen, fehlt die kompilierte Klasse auf dem Server und der ECMA-Fehler zeigt Ihnen dies auf sehr kryptische Weise an.

Eine Lösung, die wir gefunden haben, war, die Eigenschaften des WL-Projekts mit einem Rechtsklick auf den Java Build Path zu öffnen und einige der Einträge UP und DOWN mit den dortigen Schaltflächen zu verschieben. Nach dem Schließen des Eigenschaftendialogs sollte eclipse die .project-Datei neu schreiben und der Build sollte funktionieren.

Eine andere Sache, die wir manchmal getan haben, war, eine neue Klasse zum Projekt/Server/Java Teil des Projekts mit dem Eclipse New-Class Wizard hinzuzufügen, das Projekt zu säubern und neu aufzubauen und dann die Klasse wieder zu entfernen. Vielleicht starten Sie Eclipse sogar mit der Option -clean am Ende der Start-Zeichenfolge, die es verwendet.

+0

Danke, für mich war es zu schaffen eine temporäre Java-Klasse, die das Problem behoben hat. –

0

Ich konnte das gleiche Beispiel nicht wegen dieses Fehlers arbeiten, obwohl ich all diese oben genannten Dinge versuchte. Ich verwende Eclipse 4.4, Worklight 6.2, WebSphere Application Server 8.5.5.1, Java 1.7. Ich habe den Adapter ausgeführt, indem ich mit der rechten Maustaste darauf klickte und Ausführen als> Worklight-Prozedur aufrufen auswählte.

Am Ende funktionierte ich, indem ich explizit den generierten Adapters.war zum Projektaufbaupfad hinzufügte. Von den Eigenschaften des Buildpfads: Fügen Sie JARs ...> Adapters/bin/Adapters.war hinzu. Erst dann hat es angefangen zu arbeiten.

0

Dieses Problem passiert mir oft, selbst wenn ich neue Projekte auf neuen Arbeitsbereichen öffne. Ich glaube, dass die hier vorgeschlagenen Lösungen nicht alle Fälle abdecken, daher liste ich hier alle möglichen Lösungen auf, die ich gefunden habe, um das Problem zu lösen:

1) überprüfe, dass die Java-Version des laufenden Servers ist ist das selbe des Projektes, wie erwähnt here. Ich persönlich entferne alle anderen installierten JRE in den Eigenschaften des Arbeitsbereichs. Ich fand, dass sie in einigen Fällen auch die gleiche Nebenversion teilen sollten, zum Beispiel, wenn der Server die 1.7.0 ausführt, sollten Sie nicht die 1.7.19

2) überprüfen, dass auch die Compiler-Compliance-Ebene des Arbeitsbereichs passt die gleiche Java-Version, die vom Server ausgeführt wird, wie erwähnt here. Das ist es, was mich am meisten beunruhigt, da ich es oft vergessen habe.

3) überprüfen die .project Datei: als here erwähnt

4) der Regel mit diesem 3 Hinweis meine Probleme weg sind, aber aus Gründen der Vollständigkeit füge ich auch this hint, die einen Sinn haben könnte

5) Schließlich können Sie auch die vorherige "missgebildete" Anwendung vom Server entfernen und das WAR

Verwandte Themen