2013-04-29 35 views
10

Tôi đang tạo các đối tượng Java từ một lược đồ XML bằng cách sử dụng xjc. Tôi muốn tham khảo cùng một yếu tố nhiều lần trong tài liệu bằng IDREF. Tôi cũng muốn hạn chế các đối tượng được IDREF tham chiếu đến một loại cụ thể. Tôi muốn làm điều này cho mục đích xác nhận lược đồ, nhưng cũng như vậy trong mã Java, đối tượng được tham chiếu được trả về dưới dạng một kiểu cụ thể thay vì kiểu Object. Ví dụ, nói rằng tôi muốn có một giản đồ để mô tả như sau:chỉ định loại cho IDREF trong lược đồ 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> 

tôi có thể xác định player như thế này:

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

nhưng sau đó trong mã Java, khi tôi cố gắng để lấy một cầu thủ nó sẽ quay trở lại làm đối tượng kiểu và tôi phải truyền nó cho một người. Tại thời điểm đó, nếu ai đó đã tham chiếu nhầm đối tượng Nhóm, tôi có lỗi để giải quyết vấn đề đó có thể đã bị bắt gặp khi xác thực. Tôi muốn chỉ định một cái gì đó như thế này:

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

Nhưng như xa như tôi có thể nói, không có cách nào để xác định một kiểu như tôi đã làm ở đây với các thuộc tính giả tạo 'reftype'. Điều này có thể được thực hiện, bằng cách sử dụng IDREF? Nếu không, có phương pháp nào khác không?

+0

Một ref to Homestar Runner? +1 –

Trả lời

11

Bạn chỉ cần áp dụng baseType ràng buộc với phần tử player của mình. Một cái gì đó như:

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

Bạn có thể cần phải tìm ra vị trí ràng buộc chính xác cho giản đồ của mình.

Ví dụ từ mã của tôi:

Schema:

<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> 

Bindings:

<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> 

Tạo mã:

@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; 

Xem: https://svn.java.net/svn/hj3~svn/trunk/ejb/tests/issues-jpa2/src/main/resources/

+0

Làm việc như một sự quyến rũ! Tôi đang sử dụng chú thích nội tuyến. Tôi sẽ thêm một câu trả lời cho thấy tôi đã làm như thế nào. – undefined

+0

ha! các ràng buộc jaxb là chính xác những gì tôi đang tìm kiếm. Cảm ơn ! Đáng buồn thay, nó dường như không chơi độc đáo với hàm băm được tạo từ jaxb2-basic – Newtopian

10

Câu trả lời của lexicore đã cho tôi những gì tôi cần (và tôi đề nghị bỏ phiếu cho câu trả lời của anh ấy đối với tôi). Tuy nhiên tôi đang sử dụng chú thích nội tuyến thay vì tệp ràng buộc riêng biệt. Đây là ý nghĩa của nó với chú thích nội tuyến, sử dụng ví dụ về Homestar của tôi:

<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>