在字符串上调用替换会引发 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维数组上的迭代