在Camunda的Script-Task

时间:2015-10-04 12:40:46

标签: javascript camunda script-task

我正在尝试在 Camunda 进程中的 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");

执行上述脚本时,会抛出异常:

  

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

为什么?有什么问题,我该如何解决?无论如何都要调试这样的脚本吗?

1 个答案:

答案 0 :(得分:2)

Nashorn为Javascript数组提供类似NativeArray的类,因为Javascript数组与Java中的String[]之类的元素类型无关。因此,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的{​​{1}}实例(请参阅this question了解详情)。显然,可以使用相同的代码来解决问题。