我正在尝试合并 Camunda 中 Process 内 Javascript 类型的 脚本任务 中的两个数组>。这是我的脚本:
var arr1 = execution.getVariableTyped("arr1", true);
var arr2 = execution.getVariableTyped("arr2", true);
var merged = [];
for (var i1 in arr1) {
var found = false;
for (var i2 in merged) {
if (arr1[i1].id == merged[i2].id) {
found = true;
break;
}
}
if (!found) {
merged.push(arr1[i1]);
}
}
for (var i1 in arr2) {
var found = false;
for (var i2 in merged) {
if (arr2[i1].id == merged[i2].id) {
found = true;
break;
}
}
if (!found) {
merged.push(arr2[i1]);
}
}
execution.setVariable("arr1", merged);
execution.removeVariable("arr2");
当执行上述脚本时,它会抛出异常:
Cannot complete task b4fb856a-6a92-11e5-9774-005056c00008: Cannot serialize object in variable 'arr1': SPIN/JACKSON-JSON-01009 Unable to map object 'jdk.nashorn.internal.objects.NativeArray@5ff42b74' to json node
这是为什么呢?有什么问题以及如何解决它?有没有办法调试这样的脚本?
最佳答案
Nashorn 有类似 NativeArray
的类对于 Javascript 数组,因为 Javascript 数组不与元素类型绑定(bind),例如 String[]
在 java 。因此,Nashorn 创建了 NativeArray
的实例。显然,流程引擎无法存储NativeArray
的实例。因为它没有实现 java.io.Serializable
并且也不能由 JSON 和 XML 序列化程序序列化。事实上,JSON 序列化器尝试这样做,但抛出了您看到的异常。
你可以做到
execution.setVariable("arr1", Java.to(merged, "java.lang.Object[]"));
转换NativeArray
到 Java Object[]
。如果您想从 Java 代码访问该数组,可以使用更具体类型的数组。来源:Nashorn documentation
注意:
对于JDK 8版本>=1.8u40,移交的类型不是NativeArray
但 ScriptObjectMirror
的一个实例包含 NativeArray
(详情请参阅 this question)。显然,可以使用相同的代码来解决该问题。
关于javascript - 在 Camunda 的脚本任务中调试 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933566/