7

Java 6、JaxB 2、および SpringSource Tool Suite (Eclipse と同じ) を使用しています。私が作成した Java クラスがいくつかあり、そこから JaxB を使用して XML スキーマを生成しました。しかし、Java オブジェクトから XML ドキュメントを生成する JaxB の機能を使用するには、ObjectFactory が必要であることに気付きました。

final Marshaller marshaller = jaxbContext.createMarshaller();
// Here is where I don't have an ObjectFactory defined
final JAXBElement<WebLeads> webLeadsElement  
         = (new ObjectFactory()).createWebLeads(webLeadsJavaObj);

現在既に持っているクラスを吹き飛ばすことなく ObjectFactory を生成するにはどうすればよいですか?

4

3 に答える 3

11

アップデート

ObjectFactoryこの質問は、 の作成におけるの役割に言及している可能性がありますJAXBContext。コンテキスト パスでをブートストラップするJAXBContextと、そのパッケージ内のクラスを判別するために、その場所にある ObjectFactory がチェックされます。

を持っていないが、コンテキスト パス上ObjectFactoryに作成したい場合は、そのパッケージに含まれるファイルをリストするファイルで呼び出されるファイルを含めることができます(参照されるクラスは自動的に取り込まれます)。JAXBContextjaxb.indexJAXBContext

JAXBContextまたは、コンテキスト パスの代わりにクラスの配列でブートストラップすることもできます。


ObjectFactory が必要ですか

AnObjectFactoryは必須ではありませんが、Java クラスから開始する場合でも、アノテーション@XmlRegistryを使用するために でアノテーションが付けられた同様のクラスを利用できるユース ケースがあります@XmlElementDecl

JAXBElement のインスタンスの作成

いつでもJAXBElement直接作成できます。

final JAXBElement<WebLeads> webLeadsElement = new JAXBElement<WebLeads>(
    new QName("root-element-name"), 
    WebLeads.class, 
    webLeadsJavaObj);

JAXBElement の代替

または、JAXBElement は単にルート要素情報を提供するために使用されるため、WebLeadsクラスに@XmlRootElement次のアノテーションを付けることができます。

@XmlRootElement(name="root-element-name")
public class WebLeads {
   ...
}
于 2011-06-22T16:00:01.467 に答える
2

ObjectFactory は必要ないと思います。

これは、場合によっては生活を楽にするために XJC が生成する単なるユーティリティ クラスです。

編集: あなたの質問を読んで、JAXB アノテーションを使用して手動で POJO を作成したと思います。

「ルート」クラスに XmlRootElement を追加することを検討してください: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html

詳細情報: JAXB によって生成された @XmlRootElement はありません

于 2011-06-22T15:23:41.380 に答える
1

JaxB マーシャラーが機能するためにファクトリーは必要ありません。リストまたはマップ変数を含むオブジェクトを渡すと、実際には正しくマーシャリングされます。これはもちろん、マーシャリングしたいオブジェクトのクラスに対して JaxB マーシャラーを正しく初期化した場合にのみ当てはまります。

ファクトリを作成でき、そのファクトリは特殊な戻り値を作成できます(パブリック一時変数を返したくないと言います)

于 2011-06-22T15:24:29.063 に答える