javascript - 在 Camunda 的脚本任务中调试 Javascript

标签 javascript camunda script-task

我正在尝试合并 CamundaProcessJavascript 类型的 脚本任务 中的两个数组>。这是我的脚本:

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 有类似 NativeArray 的类对于 Javascript 数组,因为 Javascript 数组不与元素类型绑定(bind),例如 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

注意:

对于JDK 8版本>=1.8u40,移交的类型不是NativeArrayScriptObjectMirror 的一个实例包含 NativeArray (详情请参阅 this question)。显然,可以使用相同的代码来解决该问题。

关于javascript - 在 Camunda 的脚本任务中调试 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933566/

相关文章:

javascript - 如何在 Camunda 的 Javascript 脚本任务中使用序列化变量

javascript - Highcharts饼图外圆

javascript - 如何在 GWT jsni 中传递类名作为参数并调用常见静态方法?

java - 如何抛出 Camunda 业务错误?

sql-server - 在 ssis 中动态加载 .xlsx 文件

javascript - 为什么在计算函数时输入属性被调用数百次

javascript - 如何在客户端避免过多的ajax调用和缓存json数据

spring-boot - CAMUNDA API REST 身份验证

process - 找出候选组任务的最佳方法是什么?