在 Camunda 的脚本任务中调试 Javascript
Debugging a Javascript within Camunda's Script-Task
我正在尝试在 Javascript 类型的 Script Task 中合并两个数组 在 Camunda 中处理。这是我的脚本:
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 对于 Java 脚本数组具有 类 之类的 NativeArray
,因为 Java 脚本数组未绑定到元素类型,例如 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
注:
对于JDK8版本>=1.8u40,传递的类型不是NativeArray
而是ScriptObjectMirror
的实例a NativeArray
(详见 this question)。显然,可以使用相同的代码来解决问题。
我正在尝试在 Javascript 类型的 Script Task 中合并两个数组 在 Camunda 中处理。这是我的脚本:
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 对于 Java 脚本数组具有 类 之类的 NativeArray
,因为 Java 脚本数组未绑定到元素类型,例如 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
注:
对于JDK8版本>=1.8u40,传递的类型不是NativeArray
而是ScriptObjectMirror
的实例a NativeArray
(详见 this question)。显然,可以使用相同的代码来解决问题。