私はXMLを読み書きするためにJAXBを使用しています。私が望むのは、マーシャリングのために基底のJAXBクラスを使用し、アンマーシャリングのために継承されたJAXBクラスを使用することです。これは、送信側JavaアプリケーションがXMLを別の受信側Javaアプリケーションに送信できるようにするためです。送信者と受信者は共通のJAXBライブラリを共有します。受信者に、XMLをアンマーシャリングして、汎用のJAXBクラスを拡張する受信者固有の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() ...
}
マーシャリングは期待通りに機能します。問題は非整列化であり、サブクラス化されたパッケージ名ReceiverPerson
を使用するJAXBContextにもかかわらず、まだPerson
に整列されていません。
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
私が望むのは、ReceiverPerson
にアンマーシャリングすることです。これを行うには、@XmlRootElement
をPerson
から削除するしかありません。残念ながらこれにより、Person
がマーシャリングされることがなくなります。 JAXBが基本クラスから始まり、適切な名前の最初の@XmlRootElement
が見つかるまで下がります。私はReceiverPerson
をObjectFactory
に返すcreatePerson()
メソッドを追加しようとしましたが、それは役に立ちません。
私はこれを試しても動作しません。私が試しても、ObjectFactoryまたはXmlAdapterは決して呼び出されません。私が読んだことから、SunのJAXBは静的なクラス参照によって解決します。 Glassfishの実装にはより有望なhttps://jaxb.dev.java.net/guide/Adding_behaviors.html –
があります.XmlJavaAdaptersは、JAXB以外のクラスをJAXBで使用できるようにするのに適しています。 PersonとReceiverPerson(および/またはSuperlassがある場合)はJAXBアノテーションを持っているため、動作しません。 JAXBを使用しないPersonとReceiverPerson、およびその両方のためのアダプタが必要です。 –
マーシャル|アンマーシャルのスワップタイプを試しましたか? [...]はXmlAdapter [...]を継承しています] @Override public ReceiverPerson unmarshal(Person v){ 新しいReceiverPerson(v)を返します。 } @Override public Person marshal(ReceiverPerson v){ return v; } –