2017-03-31 5 views
0

searchValueがRegEx式の場合、RhinoのJava Stringオブジェクトで.replace(searchValue, newValue)を呼び出すのに問題があります。 searchValueがRegEx式でない場合、またはJavaScript内から開始されたStringでメソッドが呼び出された場合は、これは正常に機能します。Rhino:RhinoでJava文字列の正規表現を評価する方法

例:

サンプルJavaオブジェクトと文字列サイ、Javaオブジェクトの作成

import java.io.FileNotFoundException; 
import javax.script.*; 

public class TestRhino{ 

    public static void main(String[] args) throws FileNotFoundException, ScriptException, NoSuchMethodException { 
     // Create my Java Object 
     MyTestObject testObject = new MyTestObject(); 

     // Initiate the JavaScript engine 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); 
     Compilable compEngine = (Compilable)engine; 

     // evaluate my JavaScript file; add my Java object to it 
     engine.eval(new java.io.FileReader("MyJavaScriptFile.js")); 
     engine.put("testObject", testObject); // this adds my Java Object to Rhino 

     // Invoke my javaScript function 
     Invocable inv = (Invocable) engine; 
     Object returnVal = inv.invokeFunction("testFunction"); 

     // print out the result 
     System.out.println(returnVal); // should print "ThisisaString" to the console 
    } 
} 

マイJavaScript関数(このコードのセットアップ

public class MyTestObject { 
    public String returnStringValue() { 
     return " This is a string with spaces "; 
    } 
} 

を返すメソッドに変更できません)。

function testFunction() { 
    let myString = testObject.returnStringValue(); 
    return myString.replace(/\s/g,""); // Error! 
} 

これはエラーThe choice of Java constructor replace matching JavaScript argument types (function,string) is ambiguous; candidate constructors are: class java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence)をスローします。

ただし、JavaScript関数を次のように変更すると、Rhinoは期待値を返し、エラーはスローされません。

function testFunction() { 
    let myString = testObject.returnStringValue(); 
    return myString.replace("T", "P"); // Phis is a string with spaces 
} 

次のJavaScript関数は、Rhinoで呼び出されたときにも機能します。

function testFunction() { 
    return " This is a string with spaces ".replace(/\s/g,""); // Thisisastringwithspaces 
} 

JavaScriptコードを変更せずに上記の作業を行う方法を探しています。 Javaコードのみを変更できます。

注:これはNashorn(Java1.8以降のデフォルトのJavaScriptエンジン)でうまくいきますが、Rhino(Java 1.7までのデフォルトのJavaScriptエンジン)を使用する必要があります。

答えて

0

私の推測では、JavaコードがStringクラスの

replace(null, null); 

メソッドを呼び出しますので、それを実行する必要がある場合、知らないことである -

replace(char oldChar, char newChar); 

または

replace(CharSequence target, CharSequence replacement); 

をJava呼び出しの引数を次の場所にキャストします。

replace((CharSequence) null, (CharSequence) null); 
+0

JavaコードからではなくJavaScriptコードから '.replace(val1、val2)'が呼び出されるので、これは妥当と思われますが、この問題をどのように解決できるかはわかりません。 returnStringValue()の戻り値をCharSequenceに変更しようとしましたが、同じ問題が発生しました – Pauline

関連する問題