2017-05-12 16 views
2

Nashorn(Java 8)を使用してJavascript関数に渡す必要があるJavaScriptオブジェクトを実際にデータベースから取得します。エンジンは渡されたパラメータをJavaScriptで文字列として扱います。私はそれをJavascriptオブジェクトとして識別したい。以下はNashornを使用してJavascriptオブジェクトをJavaからJavascriptに渡す方法

コードスニペットです:

String script = "function genData(dataModel) { return 'hello world '+ dataModel.url.value + ' done'; }"; 

//"{url : {value : "abc.com",type : "string"},layout : {value : "",type : "string"}}"; 

String dataModel = "{url : {value : \"abc.com\",type : \"string\"},layout : {value : \"\",type : \"string\"}}"; 

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("JavaScript"); 
Invocable inv = (Invocable) engine; 
result = inv.invokeFunction("genData", dataModel); 

私が手にエラーがある:
javax.script.ScriptException:TypeError例外:行番号1

+0

あなたのデータモデルは、リテラル有効な文字列ではありません.... –

+0

まあアイデアはどのようにjavascriptオブジェクト示すことでした見えて、あまり秘密にしないでください。私はコメントとしてそれを移動し、それが役に立ったら文字列をエスケープしました – iqz

答えて

1

の中で未定義のプロパティ "値" を読み取ることができませんあなたはJSONとしてdataModelの文字列を最初に変換することができます - 関数自体の中でもどこかで、それを渡してください。

例:

String dataModel = ...; 
// convert the string as a JSON object 
engine.put("dataModel", dataModel); 
JSObject obj = (JSObject)engine.eval("JSON.parse(dataModel)"); 
... 
// dataModel is a script object - as it is a result of JSON.parse 
// pass it as parameter for genData 
inv.invokeFunction("genData", obj); 
0

あなたのデータモデルは、単純なJava Mapであるなら、あなたは、パラメータとして直接invokeFunctionにそれを渡すことができます。より高度な用途の場合は、パラメータにBindingsインターフェイスを実装する必要があります。これは簡単に私がライブラリを書いたようにするに

jsonと呼ば:

Example

Json j = new Json("a", 5); 
    Double result = (Double) eng.eval("a+1", j); 
関連する問題