JSONからポリモーフィック型を非整列化するためにJacksonを使用しています。私はthis postの@JsonTypeInfo
,@JsonSubTypes
、および@JsonTypeName
の注釈を例4と同様に使用しています。私の質問は、私のコードを拡張し、第3のクラスを追加する他の人が必要だと言うことです:public class Duck extends Animal
元のコードベースの外に。どのようにしてpublic abstract Animal class
のソースコード(注釈)を変更せずにSubType情報を追加することができますか?Javaでポリモーフィズムを使用して実行時にSubType情報を追加します。
UPDATE:
Iは、POJOのバージョン変更を解決するために@JsonTypeNameを使用するように強制しています。たとえば:
package my.zoo;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = Cat.class, name = "[email protected]"),
@Type(value = Dog.class, name = "[email protected]"),
@Type(value = Catv2.class, name = "[email protected]")})
public abstract class Animal {
...
}
@JsonTypeName("[email protected]")
public class Cat extends Animal {
...
}
@JsonTypeName("[email protected]")
public class Catv2 extends Animal {
...
}
@JsonTypeName("[email protected]")
public class Dog extends Animal {
...
}
// in another java package/project
package another.zoo;
import my.zoo.*;
@JsonTypeName("[email protected]")
public class Dogv2 extends Animal {
...
}
は今、私が直面しています問題は、私はAnimal
クラスに@Type(value = another.zoo.Dogv2.class, name = "[email protected]")})
を追加することなく、名称「[email protected]」と入力しているJSONを非整列化することができないということです。したがって、アノテーションでこれを行うことは明らかに不可能です。実行時にこれを行う方法はありますか?
UPDATE 2:
私はちょうど同じ/類似したユースケースでthis SO questionを発見しました。私の心配は、アノテーションを使用すると、人々があなたの基本クラス/インタフェースを拡張/実装できないことです。私はまだ私の基本クラス/インターフェイスの拡張性を維持し、私の(un)マーシャリングロジックが将来の具体的な型で動作することを確認する方法が欲しいです。
@JsonTypeInfoアノテーションで何をしましたか? JsonTypeInfo.Id.NAMEを使用しましたか? – ampofila
@ampofilaの場合、モデルコードはサンプルコードのとおりです。 。 RegisterSubtypes()呼び出しは、ブートストラップ時にアプリケーションドライバで行われました。ジャクソンをデシリアライズするとき、ジャクソンはすべてを世話します。 – derrdji
迅速な対応に感謝します。しかし、私はどのようにRESTサービスをインターセプトするのか分かりません(私はインターフェイスとしてparamを取り、インバウンドjsonを自動的にunmarhsallsするコントローラを持っています)。あなたの方法は、ファイルから何かを読むときに機能しますが、RESTを使ったPOSTリクエストには適していません。 – ampofila