2014-10-22 7 views
7

Staram się przystosować this answer w przypadku wymiany regexp:Wywołanie wymienić na ciąg rzutów EvaluatorException

<scriptdef name="propertyregex" language="javascript"> 
    <attribute name="property"/> 
    <attribute name="input"/> 
    <attribute name="regexp"/> 
    <attribute name="replace"/> 
    <![CDATA[ 
     var input = attributes.get("input"); 
     var regex = new RegExp(attributes.get("regexp")); 
     var replace = attributes.get("replace"); 
     var res = input.replace(regex, replace); 
     project.setProperty(attributes.get("property"), res); 
    ]]> 
    </scriptdef> 

Jednak wykonanie tego kodu zawsze dotrzesz wyjątek:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: 
The choice of Java constructor replace matching JavaScript argument types 
(function,java.lang.String) is ambiguous; candidate constructors are: 
    class java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence) 
    class java.lang.String replace(char,char) 

Jak można Czy zastępuję wyrażenie regularne tutaj?

Odpowiedz

6

Problem wydaje się, że jest to zmienna input z Java typu java.lang.String, która najwyraźniej nie jest natywny typ String Rhino. Można uniknąć tego problemu poprzez jawnie konstruowania ciąg JavaScript:

 var input = new String(attributes.get("input")); 
+3

Tak, jeśli oceniłeś 'typeof (attributes.get (" input "))' otrzymasz '' object "'. Mówiąc prościej, 'String (attributes.get (" input "));' również by działało. Zauważ, że w Nashorn, implementacja JavaScript JDK 8, natywne 'java.lang.String' są traktowane jako łańcuchy po stronie JavaScript. –

+0

To był także mój problem. Mój skrypt JS pod Solr pracował w systemie Windows, a nie pod Linuksem. Odniosłem się do twojej odpowiedzi i teraz działa na obu. Jak na komentarz @ DavidP.Caldwell, zmieniłem JDK na Linuksie z OpenJDK na Oracle JDK i działa również w ten sposób. Dzięki! –

4

Znalazłem kolejną odpowiedź na Alfresco forum.

Problem polega na tym, że przy interpretacji kodu JS nie można na pewno określić typu input. Może to być java.lang.String lub string Javascript. Propozycja forum pracował dla mnie - po prostu do „cast” input obiekt do JS string tak:

var res = (input + "").replace(regex, replace); 

Uwaga: Właśnie łączone wejście z pustym ciągiem.

Mam nadzieję, że to pomoże.