2013-04-29 15 views
6

Khi tạo hạt Java từ XSD với XJC, tôi cần ánh xạ xs:integer tới Integer thay vì BigInteger. Tôi đã thêm một thẻ javaType vào tệp tùy chỉnh JAXB của tôi (như đã nói trong nhiều câu trả lời từ trang web này) và nó hoạt động tốt.Tùy biến javaType JAXB trên xs: integer tạo @XmlElement với "type = String.class"

Nhưng trong mã được tạo, tôi nhận thấy rằng thẻ @XmlElement hiện có thông số type=String.class.

Bây giờ tôi tự hỏi tại sao String?
Có phải vì phân tích cú pháp và phương thức in đang chuyển đổi từ/sang các đối tượng chuỗi không?

Tôi đã thử với xjc:javaType thay vì jaxb:javaType, cho phép tôi thay thế Adapter1<String, Integer> được tạo bằng tùy chỉnh MyAdapter<BigInteger, Integer>, nhưng chính xác điều tương tự đã xảy ra.

Nếu đây là hành vi XJC bình thường, bạn có thể tinh chỉnh nó để tạo mã không có tham số này hoặc với giá trị khác hơn String không?

Lưu ý rằng mọi thứ đều hoạt động tốt, nhưng tôi muốn hiểu.
Ngoài ra tôi đang sử dụng Enunciate để ghi lại API của mình và dường như nó bị nhầm lẫn bởi điều này type (nhưng điều này có thể là lỗi trong Enunciate).


Tôi đang sử dụng JAXB RI 2.2.6, và đây là một số đoạn mã, để minh họa cho câu hỏi của tôi:

bindings.xjb

<jaxb:bindings version="2.0" ...> 
    <jaxb:globalBindings> 
     <jaxb:javaType 
       name="java.lang.Integer" 
       xmlType="xs:integer" 
       parseMethod="..." 
       printMethod="..." /> 
     </jaxb:globalBindings> 
</jaxb:bindings> 

nét Field ở XSD

<xs:complexType name="MyType"> 
    <xs:sequence> 
     <xs:element name="myField" type="xs:integer" /> 
    </xs:sequence> 
</xs:complexType> 

tạo lĩnh vực Java

@XmlElement(namespace = "...", required = true, type = String.class) 
@XmlJavaTypeAdapter(Adapter1.class) 
@XmlSchemaType(name = "integer") 
protected Integer myField; 

Trả lời

6

Tôi biết đây là một câu hỏi cũ, nhưng đối với những người vẫn đang tìm kiếm một câu trả lời: sử dụng loại xs:int thay vì xs:integer sẽ tạo ra một int java bình thường thay vì Biginteger.

+0

Vấn đề với int là nó không hỗ trợ null, Integer thực hiện. –

+0

Tất cả đều đúng, nhưng câu hỏi của tôi không phải về loại java mục tiêu, mà là về chú thích '@ XmlElement' được tạo ra. Ngoài ra nếu tôi có thể thay đổi XSD để sử dụng 'xs: int' (mà tôi không thể, đó là lý do tại sao tôi đang sử dụng một bộ chuyển đổi), tôi nghi ngờ JAXB sẽ tạo một' int' ** OR ** một 'Integer' , tùy thuộc vào tính vô hiệu của trường. –

+2

Chỉ định 'type =" int "' đưa ra 'int', chỉ rõ' minOccurs = 0' với 'type =" int "' tạo ra một 'Integer'. –

Các vấn đề liên quan