3

XML にマーシャリングする必要があるクラスがあります。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassToBeMarshalled {
    public Interface object;
}

インターフェイスは多くの具体的なクラスによって実装されており、それらのほとんどはソース コードにアクセスできないベンダー固有のものです。

だから私の問題は:

そのクラスをマーシャリングしようとすると、JAX-B は Interface の現在の具体的な実装がコンテキストで認識されていないことを訴えます。つまり、現在の実装を提供する JAXBContext.newInstance を呼び出すことによって、具体的なクラスがコンテキストにロードされませんでした。

その問題を解決する最も一般的な方法は次のとおりです。

1) XMLSeeAlso を使用する - 多くの具体的なクラスがあるため、実行可能なオプションではありません

2)各クラスに @XmlRootElement で注釈を付けます-すべてのクラスにアクセスできないため、実行可能なオプションではありません

必要に応じて JAX-B に具象クラスをそのコンテキストにロードさせる方法を知っている人はいますか?

ありがとう。

PS: JAX-B RI を使用しています

4

1 に答える 1

2

whereはDOM 表現と実際の実装クラスの間で変換できるとobjectマークできます。そのハンドラーは、マーシャリング時におそらくクラス名を格納し、アンマーシャリング時にそのクラス名を使用してインスタンスを作成する必要があります。おそらくBeanで動作するように設計されたいくつかのヘルパークラスを使用してインスタンスを手動で構成するか、その特定の名前のクラスを含み、ネストされたすべての子でそのオブジェクトを処理する別のjaxbコンテキストを使用する可能性があります。@XmlAnyElement(InterfaceHandler.class)InterfaceHandlerDomHandler

@XmlElementRef注釈も参照してください。これを適切に機能させるには、コンパイル時に少なくともすべての実装クラスを知っている必要があるのではないかと心配していますが、一般的なソリューションよりも問題が少なく、これを機能させる方法があるかもしれません前の段落で概説しました。

于 2012-09-27T21:24:31.390 に答える