2011-10-26 27 views
6

Tôi phải tạo một phần tử xml có thể có giá trị bất kỳ "kiểu nguyên thủy" (xsd: string, xsd: boolean, v.v ...). Ví dụ:JAXB - Chỉ đặt XmlAdapter cho một loại phụ cụ thể của một phần tử?

<field xsi:type="xsd:string" name="aString">String Value</field> 
<field xsi:type="xsd:dateTime" name="aDate">2011-10-21</field> 
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field> 
... 

Vì vậy, tôi sử dụng thực hiện này mà làm cho JAXB quyết định xsi:type của các loại nguyên thủy:

public class Field { 
    @XmlAttribute 
    private String name; 

    @XmlElement 
    Object value; 
} 

và nó đang làm việc như mong đợi nhưng tất cả các java.util.Date bị loại xs:dateTime ...

Bây giờ tôi muốn thay đổi hành vi của các marshaller CHỈ khi đối tượng 'giá trị' là một thể hiện của java.util.Date để có được các lĩnh vực như thế này:

<field xsi:type="xsd:date" name="aDate">2011-10-21</field> 
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field> 

Vì vậy, tôi tạo ra một bộ chuyển đổi, nhưng nếu tôi cố gắng này:

@XmlElement 
@XmlJavaTypeAdapter(DateAdapter.class) 
Object value; 

Các adapter phải xử lý một loại java.lang.Object

public class DateAdapter extends XmlAdapter<String, Object> {...} 

Nhưng tôi không muốn để mất JAXB marshallers cho tất cả các đối tượng khác (Integer, Double, etc) ...

có cách nào để đặt bộ điều hợp cho một loại phụ cụ thể của một phần tử?

+0

Bạn có tìm thấy giải pháp nào cho điều này không? – nhylated

+0

Không thực sự ... Tôi có một bộ điều hợp xử lý lớp Object và quản lý nội bộ từng loại phụ. Không phải là "đẹp", nhưng nó hoạt động. – ggarciao

Trả lời

-1

thử

http://jaxb.java.net/guide/Mapping_interfaces.html#Use__XmlJavaTypeAdapter

XmlJavaTypeAdapter cho các giao diện với nhiều triển khai

+1

-1 Bạn đã đọc câu hỏi chưa? Tôi đã thực hiện một 'XmlAdapter ' nhưng với điều này tôi mất bộ điều hợp cho 'Integer, Double, etc'. Những gì tôi muốn là giữ các adapter đó, và rõ ràng nếu tôi sử dụng adapter cho đối tượng, điều dễ dàng hơn là tạo ra 'xsi: anyType' nhưng đó chính xác là cái tôi không muốn – ggarciao

+0

Về giải pháp" triển khai nhiều " , điều đó ngụ ý rằng tôi phải xử lý và adapter cho 'Object' và thực hiện một wrapper cho mỗi lớp con đối tượng để tạo đúng' xsi: type'. Một lần nữa, ở đây tôi mất các adapter mà tôi muốn giữ lại. – ggarciao

0

tôi phải đối mặt với một tình huống tương tự mặc dù tôi đã đến từ XSD và tạo ra các lớp học từ đó. Điều đó nói rằng, giải pháp nên được transposable cho bạn là tốt.

Trong trường hợp của mình, tôi muốn mở rộng việc sử dụng một chuỗi đơn giản trong mô hình XSD sao cho nó xuất hiện dưới dạng UUID trong mã Java, sau đó một lớp khác sẽ xuất hiện dưới dạng lớp ở các vị trí khác. Bên XML, đó là tất cả chuỗi (xs: string), vì vậy làm cách nào để có được tất cả các chuỗi này thành các loại java riêng biệt ...

Điều tôi đã kết thúc là, trong XSD tôi đã tạo các kiểu đơn giản cho từng trường hợp, tại đây khai UUID:

Và sử dụng này thay vì một chuỗi bất cứ nơi nào cần thiết. Sau đó tôi đã tạo ra một tập tin ràng buộc mà tôi đã chỉ định XmlAdaptors của tôi, nhiều như bạn đã làm, ngoại trừ bây giờ tôi có các mục tiêu riêng biệt và do đó có thể sử dụng nhiều bộ điều hợp nhắm đến từng xml "loại".

Bây giờ, bạn có một khó khăn bổ sung ở đây là ở phía Java, sự biểu diễn của trường của bạn chỉ là một đối tượng. Tôi giả sử bạn sau đó bỏ nó sau khi bạn biết thuộc tính type. Có lẽ tạo một lớp con của trường cho mỗi trường hợp, điều này sẽ cho phép bạn thay đổi khai báo typeADaptor.

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