2011-01-25 31 views
34

Tôi là người mới bắt đầu với JAXB và tôi đang gặp các vấn đề gây phiền nhiễu khi tạo các lớp Java với xjc. Tôi đang cung cấp với một XSD như thế này:JAXB: Cách thay đổi tên lớp do XJC tạo ra khi loại attr được chỉ định trong XSD?

<xs:element name="item" type="itemType"/> 
... 
<xs:complexType name="itemType"> 
    <xs:attribute name="id" type="xs:string" use="required"> 
    ...  
</xs:complexType> 

và XJC là tạo ra một lớp được gọi là ItemType.java, nhưng tôi muốn tên là Item.java. Đó là, tôi muốn các lớp được tạo ra như nếu XSD là như thế này:

<xs:element name="item"> 
    <xs:complexType> 
    <xs:attribute name="id" type="xs:string" use="required"> 
     ... 
    </xs:complexType> 
</xs:element> 

Sẽ không có bất kỳ tái sử dụng itemtype trên bất kỳ yếu tố khác, nó chỉ là những người mà xây dựng XSD thích nó theo cách này. Tôi đoán có thể có một cách để làm điều đó với các ràng buộc tùy chỉnh nhưng tôi vẫn chưa tìm thấy làm thế nào.

Bất kỳ trợ giúp nào?

Cảm ơn, Miguel

+0

Bạn có thể chia sẻ dòng lệnh cuối cùng mình đã sử dụng không? –

Trả lời

58

JAXB cung cấp hai cách để thực hiện điều này:

1. Inline Schema Anntotations

Bạn có thể sử dụng JAXB chú thích giản đồ để kiểm soát các tên lớp.

<xs:schema 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     jaxb:version="2.1"> 

    <xs:complexType name="itemType"> 
     <xs:annotation> 
      <xs:appinfo> 
       <jaxb:class name="Item"/> 
      </xs:appinfo> 
     </xs:annotation> 
     <xs:attribute name="id" type="xs:string" use="required"/> 
    </xs:complexType> 

</xs:schema> 

2. External Binding file

tùy biến này cũng có thể được thực hiện thông qua và tập tin liên kết bên ngoài:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 

    <jxb:bindings schemaLocation="your-schema.xsd"> 
      <jxb:bindings node="//xs:complexType[@name='itemType']"> 
       <jxb:class name="Item"/> 
      </jxb:bindings> 
    </jxb:bindings> 

</jxb:bindings> 

Dòng lệnh XJC sẽ là:

xjc -d out -b binding.xml your-schema.xsd 
+1

Cảm ơn Blaise. Tôi không thể thay đổi xsd vì vậy nó phải được thực hiện với tập tin ràng buộc bên ngoài. Bởi bây giờ, tôi đang làm nó như bạn đã nói, nhưng tôi muốn làm điều đó chung chung hơn. Tức là, nếu tôi có một phần tử với 'type' trỏ đến một kiểu phức tạp, tôi có thể quản lý việc biên dịch tạo ra một lớp mà tên là tên của phần tử thay vì tên của kiểu phức hợp không? –

+3

ý tôi là nếu trong tương lai, những người tạo xsd sẽ thêm một mới vào xsd, tôi có thể sử dụng lại tệp ràng buộc đó để tạo ra Ô tô không lớp tự động, mà không cần sửa đổi tệp ràng buộc? –

+1

im bằng cách sử dụng các thẻ ở trên theo đề xuất của Blaise và nhận được lỗi bên dưới: phân tích cú pháp lược đồ ... Trình biên dịch [ERROR] không thể tôn trọng tùy chỉnh lớp này. Nó được đính kèm vào một địa điểm sai hoặc không phù hợp với các ràng buộc khác. dòng 8 của tệp:/C: /subhasish/demo/src/main/java/demo.xml [LRI] (tùy chỉnh ở trên được đính kèm vào vị trí sau trong sc hema) dòng 4 của tệp: /C:/subhasish/demo/src/main/java/demo.xsd Không thể phân tích cú pháp lược đồ. –

13

Vâng, cuối cùng tôi đã tìm ra cách để làm điều đó. tập ràng buộc bên ngoài của tôi là:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       jxb:extensionBindingPrefixes="xjc"> 

    <jxb:globalBindings>    
    <xjc:simple/> 
    </jxb:globalBindings> 

</jxb:bindings> 

xjc lệnh phải được thực hiện với -extension tùy chọn.

Tôi tìm thấy giải pháp trong trang này:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html

Kính trọng, Miguel

1

Đây là tập tin ràng buộc bên ngoài tôi sử dụng để đổi tên một complexType. Biên dịch với wsdl2java của cxf.

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[1]"> 
     <jxb:bindings node="//xs:complexType[@name='VatNumber_exception']"> 
      <jxb:class name="VatNumException"/> 
     </jxb:bindings> 

    </jaxws:bindings> 
</jaxws:bindings> 
Các vấn đề liên quan