2013-04-29 13 views
10

xjcを使用してXMLスキーマからJavaオブジェクトを生成しています。 IDREFを使用して、同じ要素をドキュメント内で複数回参照したいと思います。また、IDREFによって参照されるオブジェクトを特定のタイプに制約したいと思います。私は、スキーマ検証の目的でこれをやりたいと思っていますが、Javaコードでは、参照されるオブジェクトがObject型の代わりに特定の型として返されるようにしたいと思います。例えば、私は、スキーマは次のことを説明したいと言う:XMLスキーマでIDREFのタイプを指定します。

<teams> 
    <team id="team1"> 
    <coach>coachz</coach> 
    <player>homestar</player> 
    <player>marzipan</player> 
    <player>strongsad</player> 
    <player>strongbad</player> 
    </team> 

    <team id="team2"> 
    <coach>bubs</coach> 
    <player>homesar</player> 
    <player>thecheat</player> 
    <player>poopsmith</player> 
    <player>bubs</player> 
    </team> 

    <team id="allstars"> 
    <coach>poopsmith</coach> 
    <player>coachz</player> 
    <player>bubs</player> 
    <player>kingoftown</player> 
    <player>strongbad</player> 
    </team> 
</teams> 

<people> 
<person id="coachz">Coach Z</person> 
<person id="homesar">Homesar</person> 
<person id="homestar">Homestar</person> 
<person id="strongbad">Strong Bad</person> 
<person id="strongsad">Strong Sad</person> 
<person id="marzipan">Marzipan</person> 
<person id="bubs">Bubs</person> 
<person id="kingoftown">King of Town</person> 
<person id="poopsmith">The Poopsmith</person> 
<person id="thecheat">The Cheat</person> 
</people> 

私はこのようなplayerを定義することができます。

<xs:element name="player" type="xs:IDREF" maxOccurs="unbounded"/> 

が、その後Javaコードで、私はそれがするプレーヤーを取得しようとすると、タイプオブジェクトとして戻ってきて、それを人にキャストしなければなりません。その時点で、誰かが誤ってTeamオブジェクトを参照した場合、その検証に遭遇した可能性があるエラーに対処しています。私はこのような何かを指定します:

<xs:element name="player" type="xs:IDREF"reftype="person"maxOccurs="unbounded" />

をしかし、私の知る限り、私は不自然な属性「reftype」で、ここで行っているようなタイプを指定する方法はありません。これは、IDREFを使って行うことができますか?そうでない場合、別の方法がありますか?

+0

ホームスターランナーへの参照? +1 –

答えて

11

player要素にbaseTypeバインディングを適用するだけで簡単に適用できます。次のようなものがあります。

<jaxb:bindings node="xsd:element[@name='player']"> 
    <jaxb:property> 
     <jaxb:baseType name="....Person"/> 
    </jaxb:property> 
</jaxb:bindings> 

スキーマの正しいバインド場所を特定する必要があります。

私のコードからの例:

スキーマ:

<xsd:complexType name="HJIII-53-A"> 
    <xsd:sequence> 
     <xsd:element name="b" type="xsd:IDREF"/> 
     <xsd:element name="b1" type="test:HJIII-53-B"/> 
     <xsd:element name="c" type="xsd:IDREFS"/> 
     <xsd:element name="c1" type="test:HJIII-53-C" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:complexType> 

バインディング:

<jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema"> 
    <jaxb:globalBindings localScoping="toplevel"> 
     <jaxb:serializable/> 
    </jaxb:globalBindings> 
    <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='b']"> 
     <jaxb:property> 
      <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B"/> 
     </jaxb:property> 
    </jaxb:bindings> 
    <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='c']"> 
     <jaxb:property> 
      <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C"/> 
     </jaxb:property> 
    </jaxb:bindings> 
</jaxb:bindings> 

生成されたコード:

@XmlElement(required = true, type = Object.class) 
@XmlIDREF 
@XmlSchemaType(name = "IDREF") 
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b; 
@XmlElement(required = true) 
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b1; 
@XmlList 
@XmlElement(required = true, type = Object.class) 
@XmlIDREF 
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c; 
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c1; 

参照してください。https://svn.java.net/svn/hj3~svn/trunk/ejb/tests/issues-jpa2/src/main/resources/

+0

チャームのように働いた!私はインライン注釈を使用しています。私はそれをどのように行ったかを示す答えを追加します。 – undefined

+0

ha! jaxbバインディングはまさに私が探していたものです。ありがとう!残念ながら、jaxb2-basicsの生成されたhashcode関数をうまく使っていないようです – Newtopian

10

lexicoreの答えは私に必要なものを与えました(私は自分の答えを投票してください)。しかし、私は別のバインディングファイルの代わりにインライン注釈を使用しています。これは、私のHomestarの例を使って、インラインアノテーションで見えるものです:

<xs:element name="player" type="xs:IDREF" maxoccurs="unbounded"> 
    <xs:annotation> 
    <xs:appinfo> 
     <jaxb:property> 
     <jaxb:baseType name="Person"/> 
     </jaxb:property> 
    </xs:appinfo> 
    </xs:annotation> 
</xs:element> 
関連する問題