JAXB で @XmlRootElement アノテーションが省略される
問題
XML スキーマから Java クラスを生成する場合JAXB (Java Architecture for XML Binding) を使用すると、@XmlRootElement アノテーションを持つクラスがないというエラーが発生する場合があります。これにより、シリアル化中に例外が発生します。
解決策
JAXB アノテーション ルールを理解する
JAXB XJC は特定のルールを使用して決定します@XmlRootElement アノテーションを含めるタイミング。 [この記事](記事へのリンク) で説明されているように、これらのルールは複雑です。
@XmlRootElement の代替
@XmlRootElement は利便性を提供しますが、必須ではありません。代わりに [JAXBElement ラッパー オブジェクト](ドキュメントへのリンク) を使用できます。ただし、XML 要素名と名前空間の知識が必要なため、構築はあまり便利ではありません。
ObjectFactory を使用する
XJC は、生成されたクラス モデルと一緒に ObjectFactory クラスを生成します。このクラスには、オブジェクトの周囲に JAXBElement ラッパーを作成し、XML 名と名前空間を処理するファクトリ メソッドが含まれています。 ObjectFactory メソッドを調べて、ターゲット オブジェクトの JAXBElement を作成するメソッドを見つけます。
例
<code class="java">import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import org.fpml._2008.fpml_4_5.ObjectFactory; import org.fpml._2008.fpml_4_5.PositionReport; // ... // Create the JAXB context JAXBContext context = JAXBContext.newInstance(PositionReport.class); // Create the ObjectFactory ObjectFactory factory = new ObjectFactory(); // Create a PositionReport instance PositionReport positionReport = factory.createPositionReport(); // Create the JAXBElement wrapper JAXBElement<PositionReport> element = factory.createPositionReport(positionReport); // Create the Marshaller Marshaller marshaller = context.createMarshaller(); // Marshal the JAXBElement marshaller.marshal(element, System.out);</code>
以上がJAXB が Java クラスの生成時に @XmlRootElement アノテーションを省略するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。