XMLの読み取りと書き込みにJAXBを使用しています。私が欲しいのは、マーシャリングには基本JAXBクラスを使用し、アンマーシャリングには継承されたJAXBクラスを使用することです。これは、送信側のJavaアプリケーションがXMLを別の受信側のJavaアプリケーションに送信できるようにするためです。送信者と受信者は、共通のJAXBライブラリを共有します。レシーバーがXMLをアンマーシャリングして、汎用JAXBクラスを拡張するレシーバー固有のJAXBクラスにするようにします。
例:
これは、送信者が使用する一般的なJAXBクラスです。
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
これは、XMLをアンマーシャリングするときに使用されるレシーバー固有のJAXBクラスです。レシーバークラスには、レシーバーアプリケーションに固有のロジックがあります。
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
マーシャリングは期待どおりに機能します。問題はアンマーシャリングにありPerson
、JAXBContextがサブクラス化されたのパッケージ名を使用しているにもかかわらず、アンマーシャリングを行いますReceiverPerson
。
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
私が欲しいのは、にマーシャルを解除することReceiverPerson
です。私がこれを行うことができた唯一の方法は、から削除すること@XmlRootElement
ですPerson
。残念ながら、これを行うPerson
とマーシャリングされなくなります。@XmlRootElement
これは、JAXBが基本クラスから始まり、適切な名前の最初のクラスが見つかるまで下に向かって進むかのようです。createPerson()
に戻るメソッドを追加しようとしましReceiverPerson
たObjectFactory
が、それは役に立ちません。