Tình hìnhSử dụng JAXB để hỗ trợ schemas với các biến thể nhỏ
tôi cần phải hỗ trợ tạo ra các tài liệu XML dựa trên lược đồ mà thay đổi chỉ hơi giữa mỗi khác. Cụ thể, các lược đồ mà tôi cần hỗ trợ dựa trên các tiêu chuẩn ngành thay đổi đôi chút theo thời gian và các nhà cung cấp có thể tạo phiên bản tùy chỉnh riêng của chúng.
Vấn đề
tôi đã có ý định sử dụng JAXB 2 (từ Metro) với thừa kế như một giải pháp. Tôi mong đợi cấu trúc gói để kết thúc một cái gì đó như thế này:
com.company.xml.schema.v1
com.company.xml.schema.v2
com.company.xml.schema.v2.vendorxyz
Trường hợp các lớp trong gói v2 sẽ đơn giản mở rộng các lớp trong gói v1 và ghi đè khi cần thiết. Thật không may, kế hoạch đó đã kết thúc là không thể vì các lớp con không thể ghi đè lên các chú thích trong các lớp cha (see here). Ví dụ, nếu một thuộc tính trong một lược đồ được đổi tên giữa các phiên bản, thì lớp phần tử v2 sẽ phải thực hiện lại hoàn toàn phần tử mà không kế thừa từ v1.
Vì vậy, rằng lá tôi chỉ có hai tùy chọn như xa như tôi có thể nói
Lựa chọn 1
Tạo một "cơ sở" trọn gói cho từng loại lược đồ, chú thích các lớp học phần tử trong gói phần mềm đó với @ XmlAccessorType (XmlAccessType.NONE), và loại bỏ tất cả các chú thích khác. Sau đó, trong mỗi gói được tạo phiên bản, tạo các lớp phân lớp lớp tương ứng trong gói "cơ sở" và thêm tất cả các chú thích bắt buộc. Giải pháp này cho tôi một chút giúp đỡ trong lĩnh vực thừa kế, nhưng sao chép mã là rất lớn và nó sẽ là một thách thức để duy trì.
Lựa chọn 2
Không sử dụng JAXB. Tôi thực sự không thích giải pháp này vì tôi cũng muốn làm việc với JAX-RS/JAX-WS.
Câu hỏi
- Làm thế nào tôi nên sử dụng JAXB để hỗ trợ nhiều schemas với các biến thể nhỏ, mà không có một loạt các sự trùng lặp mã?
- Có sự kết hợp công nghệ khác mà tôi nên xem không?
EDIT
Các giải pháp dưới đây từ Blaise làm việc một cách hoàn hảo cho hầu hết các lược đồ của chúng tôi mà chỉ là một bản dịch nhỏ của nhau với chung cùng một dữ liệu. Tuy nhiên, chúng tôi đã gặp phải sự cố trong trường hợp sử dụng thừa kế với tên gói để phiên bản có ý nghĩa hơn. Ví dụ:
com.company.xml.schema.v1.ElementA
com.company.xml.schema.v2.ElementA
(nơi v2.ElementA kéo dài v1.ElementA)
Sử dụng OXM MOXY trong trường hợp này tình cờ gặp một lỗi và cách giải quyết có thể được tìm thấy here (với các giải pháp được cung cấp bởi Blaise, không ít hơn!)
Cảm ơn bạn rất nhiều vì câu trả lời và các mẫu. Tôi đã chuyển sang triển khai JAXB của MOXy như bạn đã đề xuất và tìm kiếm sự hỗ trợ metatdata bên ngoài rất mạnh mẽ. – Terence
Cảm ơn bạn, điều này đã giúp tôi. Chỉ một điều: kể từ phiên bản 2.4, 'JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY' được thay thế bằng 'JAXBContextProperties.OXM_METADATA_SOURCE'. – DLight