2010-12-29 1 views
1

JAXB XMLをデシリアライズするための標準的なアプローチは、コンテキストを作成するときにパッケージ名を指定することです。私は、パッケージ名を指定する必要はありませんし、まだ任意のオブジェクトをデシリアライズすることができ、より柔軟なアプローチを探していますJAXBはクラス名をXMLに格納できるため、デシリアライズコードでクラスの知識は必要ありません。

JAXBContext jc = JAXBContext.newInstance("com.foo"); 
Unmarshaller u = jc.createUnmarshaller(); 
Object o = u.unmarshal(new StringReader("<?xml version="1.0" encoding="UTF-8"  standalone="yes"?><MyJaxb>...")); 

:その後、JAXBはルート要素に基づいて、クラスを検索します。これはJAXBがXMLにパッケージを格納するのと同じくらい簡単ですが、これを行う方法を見つけることができません。私は自分でそれを行うコードを書くことができますが、それは不愉快です。可能であれば、JAXBにそれをやりたいと考えています。ところで、私はスキーマを使用していません、注釈とマーシャル/アンマーシャルだけです。何か案は?

答えて

1

実際には、純粋なJAXBで「any」オブジェクトをデシリアライズすることはできません。パッケージ(ObjectFactory.classが検索されます)またはJAXBContext.newInstance(Class1.class, Class2.class, Class3.class);のようなクラスのリストのいずれかを指定する必要があります。これはjaxbが動作する方法であり、同意の一部です。 タスクがそれより広い場合、たとえば任意のxmlデータ構造からJavaクラスを構築することも可能ですが、もう少し具体的にする必要があります。より柔軟なアプローチの意味はどういう意味ですか?

+0

クラスパス内のオブジェクトを逆シリアル化する機能が必要です。例:Object o = u.unmarshal(...);すべての可能なパッケージを指定せずに、新しいパッケージでクラスを追加するときに、リストを更新する必要はありません。パッケージ名をXMLに格納するだけです。私はGSONがこれを行うと思います。 – Andrew

+0

@Andrew。デシリアライズして何をしますか?それが問題でした。あなたはJavaでObjectを使うことはほとんどできませんが、JSに渡すとかなり多くのことができます。 – Osw

+0

Object(リフレクションなど)でできることはたくさんあります。これが私の必要です。私のソリューションはXMLにパッケージ名を追加するように見えます。 – Andrew

1

jaxbcontextオブジェクトのインスタンスを取得するときに、複数のパッケージを追加することができます。以下のようなパッケージをいくつでも追加することができます。

JAXBContext jc = JAXBContext.newInstance("com.foo.package1:com.foo.package2"); 

ただし、オブジェクトインスタンスに逆シリアル化するとどのように使用するのかよくわかりません。 デシリアライズしたものを使用しませんか?

また、アプリケーションがマルチスレッドの場合、Unmarshallerはスレッドセーフなクラスではありません。

+0

私はjax-rsを介してオブジェクトを受け取り、それを処理する方法を知っているサービスに渡します。私は複数のパッケージを提供することができますが、それはメンテナンスの問題かもしれないと思う。 – Andrew

+0

パッケージ名をプロパティファイルまたは設定ファイルに置きたい場合。上記をもう一度使用して、必要なパッケージをその設定ファイルに定義して、新しいパッケージを追加する必要があるたびにコンパイルする必要はありません。それはあなたがしたいことですか? – fmucar

+0

私はそれを行うことができましたが、新しいクラスを追加するたびに、そのファイルを更新する必要があります。自動的に更新されたビルドスクリプトはそれを解決しますが、実行する必要はありません。 JAXBにはより良い解決策がないとは想像もできません。 – Andrew