2

我正在尝试在CamundaProcess中合并Javascript类型的Script Task中的两个数组。这是我的脚本:

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");

执行上述脚本时,它会引发异常:

无法完成任务 b4fb856a-6a92-11e5-9774-005056c00008:无法序列化变量“arr1”中的对象:SPIN/JACKSON-JSON-01009 无法将对象“jdk.nashorn.internal.objects.NativeArray@5ff42b74”映射到 json 节点

这是为什么?有什么问题,我该如何解决?反正有调试这样的脚本吗?

4

1 回答 1

2

Nashorn 有类似 Javascript 数组的类NativeArray,因为 Javascript 数组不依赖于元素类型,例如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 文档

笔记:

对于JDK 8 版本 >= 1.8u40,移交的类型不是,而是包装 aNativeArray的实例(有关详细信息,请参阅此问题)。显然,可以使用相同的代码来解决问题。ScriptObjectMirrorNativeArray

于 2015-10-05T16:35:58.060 回答