2009-10-16 8 views
2

J'utilise javax.scripting avec Rhino dans ce projet.Rhino Javascript: Comment convertir l'objet en une primitive Javascript?

J'ai une méthode Java qui renvoie un objet Java (Double, Long, Entier, etc.). Je veux appeler cette méthode à partir de javascript et référence le résultat en tant que type primitif Javascript. Cependant, javacript reconnaît le type de retour en tant qu'objet. Comment puis-je forcer la conversion en primitive javascript?

Cette question est très similaire à http://groups.google.com/group/mozilla.dev.tech.js-engine.rhino/browse_thread/thread/2f3d43bb49d5288a/dde79e1aa72e1301

Le problème qui est comment puis-je obtenir une référence au contexte et à la WrapFactory?

Exemple de code:

public class data 
{ 
    Double value = 1.0d; 
    public Number get() { return value; } 
} 


    public static void main(String[] args) 
    { 
      ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
      data data = new data(); 
      try 
      { 
        engine.eval("function test(data) { return data.getD('value1') + 5;};"); 
        System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
      } 
      catch (Exception e) 
      { 
        e.printStackTrace(); 
      } 
    } 

Sortie: Résultat: 15

Répondre

3

Essayez les éléments suivants

public static void main(String [] args) throws Exception { 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
     data data = new data(); 
     Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); 

     try 
     { 
       engine.eval("function test(data) { return data.get('value1') + 5;};"); 
       System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
     } 
     catch (Exception e) 
     { 
       e.printStackTrace(); 
     } 
    } 

    public static class data 
    { 
     Double value = 1.0d; 
     public Number get(String arg) { return value; } 
    } 

Sinon, vous pouvez modifier la fonction javascript pour lancer explicitement la valeur à un certain nombre:

function test(data) { return parseInt(data.get('value1'), 10) + 5;} 
+0

Cela me donne une exception NullPointerException. Contexte.getCurrentContext() est null – Tazzy531

+0

Modifié pour fournir une implémentation correcte – Kevin

+0

Aucun effet. Obtenir toujours: Résultat: 15 – Tazzy531

0

Utilisez ce qui suit comme la sortie dans votre code JavaScript:

function aFunction(data) 
{ 
    return parseInt(data); 
} 
0

J'ai développé cette application dans laquelle vous entrez dans un ensemble de formules mathématiques qui seront évaluées par le moteur JavaScript intégré dans Java 6, que je croire est un port de rhinocéros. L'idée était que nous aurions un ensemble de cartes et ces cartes contiendrait des variables telles que:

MAP["VALUE 1"] 
MAP["VALUE 2"] 

J'ai utilisé cette approche comme certaines des expressions pour les formules proviennent de variables qui étaient sous mon contrôle et pourraient être des identifiants JS invalides. Ma première approche a été de déclarer une carte et de l'ajouter au moteur JS, mais elle a échoué de la même manière qu'elle échoue avec vous - elle l'interprétait comme une chaîne, et non comme un nombre.

La solution consistait à analyser la formule, à déterminer quelles variables étaient utilisées par celle-ci, puis à déclarer l'objet dans le moteur JS.

Quelque chose comme ceci:

var MAP = new Object(); 
MAP["VALUE 1"] = 1; 
MAP["VALUE 2"] = 2; 

Et puis MAP["VALUE 1"] + MAP["VALUE 2"] retournera 3, et non 12.

Il existe peut-être une meilleure solution autour, mais une fois que vous faites le tour du codage initial/analyse, ce qui précède fonctionnera toujours. Dans notre cas, il y a une phase où nous exécutons les instructions "déclaratives", et une autre phase où nous exécutons les formules. Le moteur JS est vraiment rapide, donc ce n'est pas un problème pour nous.

Questions connexes