2016-06-13 8 views
0

ジャクソンを使用してJSONのポリモフィックな脱塩化を試みていますが、コンパイル時にサブクラスのリストが不明なので、ベースで@JsonSubtypeアノテーションを使用できませんクラス。 代わりに、TypeIdResolverクラスを使用してプロパティ値との変換を実行します。Jackon JSON:サブクラスが不明な場合の多態的な脱灰

私が遭遇する可能性のあるサブクラスのリストは動的ですが、それらはすべて実行時にレジストリに登録されます。だから私はそのレジストリクラスへの参照を持つために、TypeIdResolverオブジェクトが必要に見えるでしょう。本質的に依存性注入環境で動作する必要があります(つまり、TypeIdResolverが参照するシングルトンクラスを持つことはできません)。そのため、レジストリクラスをTypeIdResolverに注入する必要があります。私は考えるコードの種類私が書き込みをしたいです:

ObjectMapper mapper = new ObjectMapper(); 
mapper.something(new MyTypeIdResolver(subclassRegistry)); 
mapper.readValue(...) 

しかし、私は途中でビットを行うための方法を見つけることができません。私が見つけることができる唯一のメソッドは、TypeIdResolverが何になるかを指定するためのJavaアノテーションを使用します。

この質問Is there a way to specify @JsonTypeIdResolver on mapper config instead of annotation?は同じですが、動機は異なりますが、答えはここでは動作しない注釈mixinを使用することです。

答えて

0

最後に、私がやったことはJacksonを放棄し、私がもっと簡単な方法で望んでいた種類のシリアライゼーションを行ったjavax.jsonに基づいた自分のはるかに単純なフレームワークを書くことでした。私は単純なDTO(データ転送オブジェクト)クラスだけを扱っていたので、自分の単純なフレームワークを書くほうがはるかに簡単でした。

1

SimpleModuleには、サブタイプを登録できる方法registerSubtypes()があります。 Classを渡すだけの場合は、単純なクラス名が型IDとして使用されますが、NamedTypeを渡して、サブクラスに使用する型IDを定義することもできます。

フルセットが分かっている場合は、SimpleModuleを作成してマッパーに登録してください。

これが機能しない場合は、スタティックシングルトンインスタンス(該当する場合)または単にThreadLocalでデータを共有するだけでよい場合もあります。

関連する問題