2013-04-29 3 views
10

Я генерирую Java-объекты из схемы XML с помощью xjc. Я хотел бы ссылаться на один и тот же элемент несколько раз в документе, используя IDREF. Я также хотел бы ограничить объекты, на которые ссылается IDREF на определенный тип. Я хотел бы сделать это для проверки схемы, но также и для того, чтобы в Java-коде ссылочный объект возвращался как определенный тип вместо типа Object. Например, скажем, я хочу схему, чтобы описать следующим образом:указать тип для IDREF в XML-схеме

<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

A ref to Homestar Runner? +1 –

ответ

11

Вы можете просто применить привязку baseType к вашему элементу player. Что-то вроде:

<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 - это именно то, что я искал. Благодаря ! К сожалению, похоже, что он не играет хорошо с созданной функцией hashcode из jaxb2-basics – 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> 
Смежные вопросы