2

CamundaのProcess内のタイプJavascriptのScript Taskで2 つの配列をマージしようとしています。これが私のスクリプトです:

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

何故ですか?何が問題で、どうすれば修正できますか? とにかくそのようなスクリプトをデバッグする方法はありますか?

4

1 に答える 1

2

Nashorn にはNativeArray、Javascript 配列のようなクラスがあります。Javascript 配列は、たとえば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 のドキュメント

ノート:

JDK 8 バージョン >= 1.8u40の場合、渡される型は、ラップされたNativeArrayのインスタンスではありません(詳細については、この質問を参照してください)。どうやら、同じコードを使用して問題を解決できるようです。ScriptObjectMirrorNativeArray

于 2015-10-05T16:35:58.060 に答える