2013-05-17 18 views
5

Ho visto una serie di domande su questo problema ma nessuna risposta conclusiva. Sto riscontrando problemi nel chiamare una classe Java dall'implementazione dell'adattatore Worklight. Ho sostituito il mio codice con il codice dell'esercitazione IBM Worklight Java Adapter e ha esito negativo nello stesso modo. Inoltre ho trovato una risposta sul sito di IBM dicendo che il compilatore Java 1.7 potrebbe causare questo problema e utilizzare Java 1.6. Ho convalidato che il mio compilatore in Eclipse è Java 1.6.ECMA TypeError che chiama classe Java dall'adattatore Worklight

Screenshot of Eclipse and code path

classi Java mio iniziano tutti con com (ad esempio com.worklight.customcode). Ho provato sia a chiamare metodi statici pubblici (usando la sintassi corretta) sia a istanziare l'oggetto e chiamare il metodo. Come detto sopra, ho anche convalidato che sto usando il compilatore Java 1.6.

Ecco alcuni esempi di codice:

adattatore file di implementazione:

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

file di Java (campione inedito IBM Worklight): pacchetto 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; 
    } 

} 

Problemi con la 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

Alcune delle domande relative sono:

risposta

2

Ero vicino, non era CLASSPATH di per sé, ma piuttosto (apparentemente) le impostazioni del progetto Eclipse.

Dopo una settimana o più di ricerca e disattivazione, ho modificato il file .project per includere determinati tag buildCommand che il mio progetto non aveva. L'aggiunta dei seguenti buildCommands alla sezione consentiva al mio codice di avviare le classi Java da JavaScript dopo il riavvio di Eclipse.

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

Il file .project si trova nella directory principale della casa progetto di Worklight (ad esempio myproject/.project). Alla fine l'ho capito, passando attraverso un progetto di lavoro che ha chiamato Java da JavaScript.

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

ho copiato il codice di Verbatim al mio progetto e aveva lo stesso comportamento come il mio codice. Ho copiato il mio codice su quel progetto e il mio codice ha funzionato (!!). Ho quindi confrontato i percorsi di classe, che erano in qualche modo diversi, ma non ha modificato il comportamento. Ho ispezionato il file .project e ho notato che il mio file non aveva i tag buildCommand sopra.Invece il mio file aveva un numero di tag ExternalToolBuilding, presumibilmente perché uno dei ragazzi del mio team utilizza un IDE diverso da Eclipse e il suo .project è diventato quello del progetto. (Penso che sia Sublime, se è importante).

Non capisco tutti i dettagli di ciò che ciascuno di questi tag fa o esattamente come e perché Worklight ed Eclipse cambiano il loro comportamento a causa di esso (o perché sono scomparsi in primo luogo). Tuttavia, ha reso il mio codice funzionante. Mi è costato solo una settimana di lavoro (ack!).

Spero che questo aiuti qualcun altro in futuro.

0

Prima consente di verificare che non si tratti di un problema di conversione del tipo. Nel codice Java definire la funzione Add con due parametri degli oggetti:

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

sguardo al output del server. Se si trattava di un problema di tipo, ora il metodo dovrebbe funzionare. In caso contrario, abbiamo un altro problema ...

+0

Grazie Idan. Ho verificato che la modifica del tipo da int a Object non ha fatto alcuna differenza. Ho fatto lo stesso errore. – user2217751

+0

Sospetto fortemente che si tratti di un problema di classpath con Eclipse/Worklight. Un altro dettaglio interessante è che il codice che uno dei miei sviluppatori ha funzionato (che è obsoleto nel nostro progetto ora) ha funzionato bene sulla sua macchina ma non ha mai fatto il mio. Ho appena realizzato che si trattava di un problema simile. Non riesco a far funzionare QUALSIASI classe Java da JavaScript. Nel setacciare Internet per quanto riguarda questo problema, sembra molto simile a un classpath (o simile problema di configurazione) in cui funziona sulla macchina di una persona, ma non su quella di un'altra persona. Qualche consiglio su dove controllare la configurazione in WL? Ho ovviamente controllato il classpath. – user2217751

+0

Ecco un collegamento a un'altra domanda che sembra correlata (e non risolta): http://stackoverflow.com/questions/15826456/ecma-errortypeerror-cannot-call-property?rq=1 – user2217751

2

abbiamo avuto questo problema più volte e ha sempre avuto a che fare con un file .project danneggiato da eclissi. Quello che succede è che la classe Java che hai non viene creata e non viene aggiunta al tuo file worklight.war. Quando si distribuisce l'app, la classe compilata è mancante sul server e l'errore ECMA lo dice in modo molto criptico.

Una soluzione che abbiamo trovato era quella di aprire le proprietà del progetto WL con un clic con il pulsante destro del mouse su Percorso di costruzione Java e spostare alcune delle voci SU e GIÙ usando i pulsanti lì. Dopo aver chiuso la finestra delle proprietà, eclipse dovrebbe riscrivere il file .project e la build dovrebbe funzionare.

Un'altra cosa che abbiamo fatto a volte era aggiungere una nuova classe alla parte project/server/java del progetto usando la procedura guidata di Eclipse New-Class, pulire e ricostruire il progetto e quindi rimuovere di nuovo la classe. Magari anche avviare eclipse con l'opzione -clean alla fine della stringa di avvio che utilizza.

+0

Grazie, per me stava creando una classe Java temporanea che ha risolto il problema. –

0

Non ho potuto ottenere questo stesso esempio di lavoro a causa di questo errore, nonostante il tentativo di tutte queste cose sopra menzionate. Uso Eclipse 4.4, Worklight 6.2, WebSphere Application Server 8.5.5.1, Java 1.7. Stavo eseguendo l'adattatore facendo clic con il pulsante destro del mouse e selezionando Esegui come> Richiama procedura Worklight.

Alla fine, ho capito di lavoro aggiungendo esplicitamente l'Adapters.war generato al percorso del progetto di costruzione. Dalle proprietà del percorso di creazione: Aggiungi JAR ...> Schede/bin/Adattatori.war. Solo allora ha iniziato a funzionare.

0

Questo problema mi capita spesso anche quando apro nuovi progetti su nuovi spazi di lavoro. Credo che le soluzioni proposte qui non coprano tutti i casi, quindi per l'utilità di tutti, elencherò qui tutte le possibili soluzioni che ho trovato per risolvere il problema:

1) verificare che la versione Java del server in esecuzione è lo stesso del progetto, come menzionato here. Io personalmente rimuovo tutti gli altri JRE installati nelle proprietà dell'area di lavoro. Ho scoperto che in alcuni casi dovevano condividere anche la stessa versione minore, ad esempio se il server esegue 1.7.0 non dovresti avere il 1.7.49

2) verificare anche il livello di conformità del compilatore dell'area di lavoro si adatta alla stessa versione java eseguita dal server, come indicato here. Questo è ciò che mi causa la maggior parte dei problemi poiché è qualcosa che ho dimenticato spesso.

3) verificare il file .project: come accennato here

4) Di solito con questo 3 suggerimento miei problemi sono andati, ma per amor di completezza aggiungo anche this hint che potrebbe avere un qualche senso

5) infine è anche possibile rimuovere la precedente applicazione "malformata" dal server e ricostruire il WAR