在 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);
我创建了一个 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
在序列化修改后的列表时遇到问题。那么应该如何序列化呢?
基本上这与描述的问题相同 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);