2017-03-08 3 views
1

私は、既存のレガシーシステム用のシンプルなdiffシステムを実装しようとしています。私は複数の潜在的なオブジェクト状態間の差異をJaversを使用して計算し、それらを直列化バージョンで永続化しています。私はオブジェクトに変更をコミットしたくないだけで、私の差分を追跡します。ジャバースディフュールをデシリアライズすることはできますか?

以前にシリアライズされたDiffでDiffオブジェクトを再作成する方法はありますか?私はを変更したくない、ベースエンティティを持っている

は、ここに私のユースケースです。システムは同じエンティティの新しいバージョンを受け取り、それらが私の基本エンティティとどのように異なるかを知りたい。私はJavers Diffを使ってその違いを見つけて表示することができますが、明らかにdiffをシリアライズすることでそれらを保持しますが、シリアライズされたdiffを介してDBから復元することはできません。

同じ目的を達成する方法の1つは、変更された代替エンティティ全体を永続させ、実行時にDiffを計算することですが、いくつかのフィールドしか存在しない場合は、かわった。私のエンティティの代替バージョンを永続させることは、ユニークなキーのために私の既存のシステムを混乱させるでしょう。

答えて

1

これを行う正しい方法が見つかりました。私はJackson ObjectMapperを使用してシリアル化/デシリアライゼーションを行っていましたが、これは問題を起こしていました。適切に私はJaversの内部JsonConverter使用していたシリアライズとデシリアライズするには

Diff diff = javers.compare(myObject1, myObject2) 

//Tears and pain :(
String omDiff = objectMapper.writeValueAsString(diff) 
Diff fromOm = objectMapper.readValue(omDiff, Diff.class) 

//yay :) 
String jcDiff = jsonConverter.toJson(diff) 
Diff fromJc = jsonConverter.fromJson(jcDiff, Diff.class) 
+0

こんにちは@Solvemonは、あなたの成功を共有していただきありがとうございます。どうぞ、JsonConverterのインスタンスをどう取得しましたか? 'JsonConverterBuilder'から取得しようとしていますが、実行時に失敗します:' org.javers.core.diff.Changeクラスの引数なしのコンストラクタを呼び出せません。 –

+0

** FIXED ** - OK、私と同じことをする(つまり、 'new JsonConverterBuilder()。build()'を呼び出す)ために、このタイプのGsonを使用してInstanceCreatorを登録するとこの問題が解決される可能性があります。それをしないでください。 :)単に 'JAVERS.getJsonConverter()'を呼び出します。そうすれば、永続性があなたのために働くでしょう。 –

0

現在、シャドウと呼ばれる機能に取り組んでいます。 https://github.com/javers/javers/issues/133。したがって、JaversRepositoryに保存されたスナップショットから元のドメインオブジェクトを復元することができます。しかし、diffsは2つの状態間の変更だけをキャプチャするため、元のオブジェクトをdiffから復元することはできません。