2014-10-22 16 views
7

Sto cercando di adattarsi this answer al caso di sostituzione regexp:Calling sostituire su stringa tiri 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> 

Tuttavia, l'esecuzione di codice che ottengo sempre un'eccezione:

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) 

Come Faccio la sostituzione delle espressioni regolari qui?

risposta

6

Il problema sembra essere che questa variabile è input del Java tipo java.lang.String, che a quanto pare non è il tipo String nativo di Rhino. È possibile evitare questo problema esplicitamente la costruzione di una stringa JavaScript:

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

Sì, se avete valutato 'typeof (attributes.get (" input "))' otterreste '" oggetto "'. Più semplicemente, 'String (attributes.get (" input "));' funzionerebbe anche. Si noti che in Nashorn, l'implementazione JavaScript JDK 8, nativa 'java.lang.String' sono trattate come stringhe sul lato JavaScript. –

+0

Questo era il mio problema pure. Il mio script JS sotto Solr funzionava su Windows e non su Linux. Ho fatto riferimento alla tua risposta e funziona su entrambi adesso. Come per il commento di @ DavidP.Caldwell, ho cambiato il JDK su Linux da OpenJDK a Oracle JDK e funziona anche in questo modo. Grazie! –

4

ho trovato un'altra risposta su Alfresco forum.

Il problema è che quando il codice JS viene interpretato, il tipo di input non può essere determinato con certezza. Potrebbe essere java.lang.String o Javascripts string. La proposta del forum ha lavorato per me - solo per "lanciare" input oggetto di JS string in questo modo:

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

Nota: Ho appena concatenati l'input con la stringa vuota.

Spero che questo aiuti.