2012-03-09 10 views
0

JAXBを使用してオブジェクトをXMLにマーシャリングする際に問題が発生しています。 JAXB継承問題 - 名前空間の破損

  • をハイジャック
    • 親:私たちのコード例では、我々は三種類を持っている(https://github.com/fbe/JaxbIssueTracker、簡単なMavenプロジェクトは、テスト・ケースは、何が間違って起こっているの実証します)具体的な

    のXSDは、ここで見つけることができます:github

    親の型は抽象であり、具体的には親を拡張し、親はハイジャックされた型をシーケンスで参照します。これらのxsdファイルから、JAXB(xjc)によって警告またはエラーメッセージなしでJAVAファイルが生成されています。

    次のXML出力は、JAXBで生成されている具体的なタイプのマーシャリング時:あなたはハイジャック型が誤って親の名前空間を参照しNS2-接頭辞を使用している見ることができるように

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <ns3:concreteType xmlns:ns2="http://www.felixbecker.name/parent" xmlns="http://www.felixbecker.name/hijacked" xmlns:ns3="http://www.felixbecker.name/concrete"> 
        <ns2:hijacked> 
         <value>foobar</value> 
        </ns2:hijacked> 
    </ns3:concreteType> 
    

    を代わりに、ハイジャックされた名前空間を参照するデフォルトの名前空間を使用する必要があります。

    JAXBは、生成されたxmlを非マーシャルすることはできませんが、アクティブ化されたスキーマ検証では生成されます。

    ここで何が問題になりますか? XMLスキーマは壊れていますか?または、JAXBは継承を正しく処理できませんか?

    parent.xsdから抽象属性を削除しても、直面している問題に影響はありませんでした。

    ご協力いただければ幸いです。 :-)

    使用されたバージョン(両方の破壊):

    • JAXB JDK 1.6
    • から
    • JAXB-RI 2.2.5

    よろしく、

    FBE & ollinux

  • 答えて

    0

    あなたの例では、hijacked要素は実際に親スキーマで定義されているため、 "親"名前空間に配置されます。これは、マーシャリングされたドキュメントの名前空間が正しいことを意味します。もしjaxbが文書を非整列化することができれば、それ自体マーシャルされます。

    あなたはhijackedスキーマに要素宣言を移動し、親スキーマに

    <element ref="hijacked:hijacked"/> 
    

    を使用することができ、正しい名前空間内のhijacked要素を取得します。