我试图在Camunda的Process中合并Java类型的脚本任务中的两个数组。这是我的脚本:

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
  节点


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

最佳答案

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

注意:

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

07-24 14:45