使用Solr ScriptUpdateProcessor进行修补,因此我有一个没有浏览器的javascript文件。我对此很新,我不知道如何在调试器中运行它,并且仅限于系统日志记录。
在这个javascript文件中,我有一个我认为是数组的对象,但奇怪地错过了javascript数组的基本属性。
所以我用这个函数转储了对象:
function log_object(object) {
var output = '';
for (var property in object) {
output += property + ': ' + object[property]+'; \n';
}
logger.info(output);
}
回来的结果看起来像“真正的”Java。最值得注意的是:
class: class java.util.ArrayList;
更多的是:
clone: function clone() {/*
java.lang.Object clone()
*/}
;
toArray: function toArray() {/*
java.lang.Object[] toArray()
java.lang.Object[] toArray(java.lang.Object[])
*/}
;
iterator: function iterator() {/*
java.util.Iterator iterator()
*/}
;
addAll: function addAll() {/*
boolean addAll(int,java.util.Collection)
boolean addAll(java.util.Collection)
*/}
;
get: function get() {/*
java.lang.Object get(int)
*/}
;
equals: function equals() {/*
boolean equals(java.lang.Object)
*/}
等。 心灵震撼。
我是如何在javascript函数中结束基本java对象的?这是怎么回事?
我之前从未意识到java-to-and-from-javascript的灰色区域。 test-update-script.js中的最终“工作代码”如下所示:
doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument <- note this is also java?
var contents = []; <-- 'normal' js Array.
vals = doc.getFieldValues(my_multivalued_field); // <--- vals is now java.util.arraylist
jsFriendlyAry = vals.toArray(); // <-- jsFriendlyAry is String[]
for (j = 0; j < jsFriendlyAry.length; j++) {
contents.push(jsFriendlyAry[j]);
}
因此可以混合使用服务器端的javascript和java。 Oracle's guide to using Java from Scripts中的摘要 似乎需要一个我尚未想到的包含(特别是Java.to和Java.from),但确认行为。
答案 0 :(得分:0)
默认情况下,使用Java对脚本支持(https://lucene.apache.org/solr/4_7_0/solr-core/org/apache/solr/update/processor/StatelessScriptUpdateProcessorFactory.html)
执行更新脚本在Rhino Javascript engine的原始实现中,JS被编译为Java类,并且自1998年以来脚本已被解释。
所以看起来这些脚本似乎是从Java运行的Java,而不是孤立的。这解释了为什么转储对象与POJO的共同点比“普通”JS对象更多。