在字符串上调用替换会引发 EvaluatorException

Posted

技术标签:

【中文标题】在字符串上调用替换会引发 EvaluatorException【英文标题】:Calling replace on string throws EvaluatorException 【发布时间】:2014-12-18 00:01:50 【问题描述】:

我正在尝试使this answer 适应正则表达式替换的情况:

  <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>

但是,执行该代码时我总是遇到异常:

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)

这里如何进行正则表达式替换?

【问题讨论】:

【参考方案1】:

问题似乎是这个变量input 属于Java 类型java.lang.String,这显然不是Rhino 的原生String 类型。你可以通过显式构造一个 JavaScript 字符串来避免这个问题:

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

【讨论】:

是的,如果你评估了typeof(attributes.get("input")),你会得到"object"。更简单地说,String(attributes.get("input")); 也可以。请注意,在 Nashorn(JDK 8 JavaScript 实现)中,本机 java.lang.String 在 JavaScript 端被视为字符串。 这也是我的问题。我在 Solr 下的 JS 脚本在 Windows 上运行,而不是在 linux 下运行。我提到了你的答案,它现在适用于两者。根据@DavidP.Caldwell 的评论,我将 Linux 上的 JDK 从 OpenJDK 更改为 Oracle JDK,它也可以这样工作。谢谢!【参考方案2】:

我在Alfresco forum 上找到了另一个答案。

问题是,解释JS代码时,无法确定input的类型。它可能是java.lang.String 或Javascripts 的string。论坛的提议对我有用 - 只是将 input 对象“投射”到 JS string,如下所示:

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

注意:我刚刚将输入与空字符串连接起来。

希望这会有所帮助。

【讨论】:

以上是关于在字符串上调用替换会引发 EvaluatorException的主要内容,如果未能解决你的问题,请参考以下文章

WCF 跟踪在使用 JSONP 的调用函数上引发 XML 异常“遇到意外字符'j'”

使用 Laravel 5.5 在实时数据库上调用存储过程会引发内存错误

在一个元素的数组上调用list()方法会引发TypeError:在0维数组上的迭代

如何在对引发异常的 C# webmethod 的 ajax 调用上指定消息?

什么会生成此错误“调用目标已引发异常”?

gson 替换 fastjson 引发的线上问题分析