【问题标题】:Debugging a Javascript within Camunda's Script-Task在 Camunda 的脚本任务中调试 Javascript
【发布时间】:2016-01-01 05:19:54
【问题描述】:

我正在尝试在 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 节点

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

【问题讨论】:

标签: javascript camunda script-task


【解决方案1】:

Nashorn 有像 NativeArray 这样的类用于 Javascript 数组,因为 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,而是包装NativeArrayScriptObjectMirror 实例(详见this question)。显然,可以使用相同的代码来解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2020-10-28
    • 2013-10-19
    相关资源
    最近更新 更多