在 Javascript 中修改 ArrayList 会导致 Camunda 中的序列化失败

Modifying an ArrayList in Javascript results in serialization failure in Camunda

我创建了一个 BPMN 协作模型,其中包含 Javascript 类型的脚本任务。然后我用这样的流程变量实例化了一个流程实例:

Variable name: arr
Object type name: java.util.ArrayList
Serialization Data Format: application/x-java-serialized-object
Value: [{ "id": 10 }]

然后我把脚本任务传过去了,代码如下:

var arr = execution.getVariable("arr");
execution.setVariable("arr2", arr);

它 运行 成功了。然后我修改脚本任务是这样的:

var arr = execution.getVariable("arr");
arr.add({ "id" : 2 });
execution.setVariable("arr2", arr);

并重新部署,重新实例化;令我惊讶的是它导致了一个错误:

Cannot submit task form xxx: Cannot serialize object in variable 'arr': jdk.nashorn.internal.scripts.JO4

有人可以告诉我我做错了什么吗?

[更新]

我刚刚发现了一些新东西,如果我像这样修改 ArrayList:

var arr = execution.getVariable("arr");
arr.add(2);
execution.setVariable("arr2", arr);

效果很好!而修改后的值为:

[{ "id": 10 }, 2]

这意味着 setVariable 在序列化修改后的列表时遇到问题。那么应该如何序列化呢?

基本上这与描述的问题相同 。我们在这里处理的不是在 Java 脚本中创建的数组,而是一个对象,显然 Nashorn 在内部表示为 class jdk.nashorn.internal.scripts.JO4 的实例,流程引擎无法序列化(使用 JDK >= 8u40,当调用 Java 方法时,JO4 实例被包裹在 ScriptObjectMirror 实例中,但问题是相同的)。

要创建一个Java class的实例,您可以使用以下代码:

var HashMap = Java.type("java.util.HashMap");
var instance = new HashMap();
instance.id = 2;
arr.add(instance);
execution.setVariable("arr2", arr);

来源:Nashorn documentation