L'appel de @JSFunction à partir de JavaScript, TypeError: Impossible de trouver la valeur par défaut pour l'objet
Je suis d'appeler un @JSFunction
méthode annotée d'un ScriptableObject
Le fichier JavaScript
Target = Packages.com.acme.rhino.Target;
function evaluate() {
var t = Target();
t.addModifier("foobar", 1);
return t;
}
Le Fichier Java
public class Target extends ScriptableObject {
private static final long serialVersionUID = 1L;
public List<Modifier> modifiers = new LinkedList<>();
@JSConstructor
public Target() {
}
@JSFunction
public void addModifier(final String message, final int value) {
modifiers.add(new Modifier(message, value));
}
public int getValue() {
int sum = 0;
for (final Modifier modifier : modifiers) {
sum += modifier.getValue();
}
return sum;
}
@Override
public String getClassName() {
return "Target";
}
}
Mais je reçois
org.mozilla.javascript.EcmaError: TypeError: Cannot find default value for object.
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3693)
at org.mozilla.javascript.ScriptRuntime.typeError1(ScriptRuntime.java:3705)
at org.mozilla.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:976 )
at org.mozilla.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:895 )
at org.mozilla.javascript.ScriptRuntime.toString(ScriptRuntime.java:761)
at org.mozilla.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:3774)
at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime. java:2269)
at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime. java:2251)
at org.mozilla.javascript.optimizer.OptRuntime.callProp0(OptRuntime.java:83)
at org.mozilla.javascript.gen.script_5._c_evaluate_1(script:6)
at org.mozilla.javascript.gen.script_5.call(script)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen.script_5.call(script)
et ne sais pas où aller à partir de là. Quand je ne l'appelez pas addModifier
méthode le code fonctionne, et compte tenu de l'erreur notFunctionError
dans la trace de la pile je pense que Rhino ne pas interpréter la méthode donnée comme une Fonction JavaScript.
- OSX 10.8.2
- Java 7
- Rhino 1.7R4
Complète de projet Maven qui reproduit l'erreur peut être trouvé ici
OriginalL'auteur oschrenk | 2013-01-28
Vous devez vous connecter pour publier un commentaire.
tl;dr voir ces deux alternatives.
Le problème avec l'approche ci-dessus est que
Target.prototype
n'est pas correctement configuré dans le script de la portée. Voir la statiqueScriptableObject.defineClass()
méthode pour plus de détails sur la façon de bien définir les prototypes dans un script portée.Vous avez un couple de solutions de rechange pour la prestation de la
Target
constructeur de vos scripts. Le première alternative serait de toujours définir lesTarget
constructeur pour tous les scripts. Cela fonctionne bien si vous savez à l'avance de l'heure à laquelle vous souhaitezTarget
à être disponible dans le monde entier. Cela vient essentiellement le suivant:Si au contraire, vous voulez de l'auteur du script pour décider laquelle les constructeurs sont nécessaires, le deuxième alternative est de fournir le
defineClass
fonction de scripts. Avec cette fonction, les auteurs de script peut "importer" tout scriptable des objets sur leur chemin de classe (qui peut être plus que vous souhaitez autoriser). Pour fournir ladefineClass
fonctions de scripts, effectuez les opérations suivantes après avoir entré le contexte:Et puis, le JavaScript auteur fait usage de la
Target
constructeur avec les éléments suivants:Dans les deux branches, j'ai fait une couple d'autres changements que vous mieux si vous ajoutez plus de la
Target
constructeur. L'argument zero constructeur n'a pas besoin de la@JSConstructor
annotation. Si plus tard vous voulez avoir un constructeur qui accepte les arguments, ce zéro argument constructeur est utilisé comme le prototype du constructeur, et vous pouvez utiliser le@JSConstructor
annotation sur une méthode qui sera utilisée pour initialiser votre objet. Selon la façon dont vous êtes l'auteur de cette méthode constructeur, il deviendra important d'utiliser lenew
mot-clé dans votre JavaScript.En bref, le
Packages.com.acme...
syntaxe est pas utile pour avoir accès àScriptableObject
constructeurs à partir de scripts.Cela ne fonctionne pas pour moi.
OriginalL'auteur Tim Schaub
Je le faire fonctionner (très semblable code) à l'aide de l'opérateur new. Dans votre exemple, faire
devrait fonctionner aussi bien.
OriginalL'auteur elxala