2010-03-20 36 views
8

Tôi có một mô hình dữ liệu hiện có. Tôi muốn thể hiện mô hình dữ liệu này về XML.JAXB - Chuyển sang XSD hoặc XSD sang đậu?

Dường như tôi có hai lựa chọn nếu tôi sử dụng JAXB:

  • Tạo một XSD phản ánh mô hình dữ liệu của tôi, và sử dụng XJC để tạo các đối tượng ràng buộc. Marshalling và unmarshalling sẽ liên quan đến việc tạo ra một lớp "ánh xạ" sẽ lấy các đối tượng dữ liệu hiện có của tôi và ánh xạ chúng tới các đối tượng mà xjc tạo ra. Ví dụ, trong mô hình dữ liệu của tôi, tôi có một lớp Doc và JAXB sẽ tạo một lớp Doc khác với các trường chính xác giống nhau, và tôi sẽ phải ánh xạ từ lớp Doc của tôi tới lớp Doc của xjc.
  • Chú thích mô hình dữ liệu hiện có của tôi bằng chú thích JAXB và sử dụng schemagen để tạo XSD từ các lớp được chú thích của tôi.

Tôi có thể thấy các ưu và nhược điểm của cả hai cách tiếp cận. Dường như hầu hết mọi người sử dụng JAXB đều bắt đầu với tệp XSD. Nó có ý nghĩa rằng XSD phải là sự thật tiêu chuẩn vàng, vì nó thể hiện mô hình dữ liệu theo cách thực sự đa nền tảng.

Tôi có khuynh hướng bắt đầu với XSD trước, nhưng có vẻ như tôi phải viết và duy trì một lớp bản đồ riêng biệt để chuyển dữ liệu giữa thế giới của tôi và thế giới JAXB.

Bất kỳ đề xuất nào?

Trả lời

6

Có XSD được tạo từ các lớp hiện có âm thanh với tôi như cách an toàn nhất để đi.

Tuy nhiên, hãy giải thích rằng trừ khi bạn biết rõ JAXB thì cách tiếp cận với chú thích các lớp của riêng bạn có thể cực kỳ bực bội (cả về đau và thời gian :)).

Điều này đã xảy ra với tôi trong ngữ cảnh liên quan khi tôi cố gắng trích xuất thủ công siêu lớp từ các lớp được tạo bởi JAXB và sau đó sắp xếp các cá thể thành XML. Tôi đã nhận được nhiều ngoại lệ JAXB (bí ẩn). Đúng vậy, kiến ​​thức JAXB của tôi chưa sâu lắm.

Nếu bạn nhấn mạnh vào việc sử dụng JAXB thì tôi khuyên bạn nên xem xét sử dụng phương pháp tiếp cận đầu tiên (XSD + XJC) như một cách để có được chú thích JAXB ban đầu cho lớp học của bạn.

Bạn có thể sử dụng XSD + XJC để có ý tưởng cách chú thích các lớp của riêng bạn. Sau đó, bạn có thể thử và chỉnh sửa các chú thích chính xác trên chúng. Bắt đầu với các lớp phức tạp hơn (tham chiếu, kế thừa, danh sách tham chiếu, danh sách tham chiếu đến lớp cơ sở trừu tượng) sớm.

Sử dụng công nghệ khác để tạo XSD từ các lớp không được chú thích khi khởi động đá trên XSD có thể hữu ích. Hoặc bạn có thể đi cho một XSD bao gồm hầu hết những gì các lớp học của bạn sử dụng.

Nếu ý định của nỗ lực này cũng có thể sắp xếp các trường hợp thành XML, thì tôi đề nghị được xem trên JAXBElement. Trong một số trường hợp (mà tôi không thể ghim điểm do thiếu kiến ​​thức) các trường hợp sẽ không so sánh trừ khi chúng được bao bọc trong một JAXBElement.

Chúng tôi sử dụng HyperJAXB để tạo tầng kiên trì dựa trên bộ XSD. Các lớp được tạo ra cũng được sử dụng cho marshaling. Chúng tôi có rất nhiều 'niềm vui' làm điều này để làm việc đặc biệt. vì IDREF và JAXBElement.

1

Bạn có thể sử dụng xjc và vẫn chỉ có một lớp với chú thích XML sẽ là máy chủ làm đối tượng dữ liệu. Nhưng đó là trong trường hợp bạn không tái tạo các lớp học trên mỗi được xây dựng.

Và khi tạo mã theo ý kiến ​​của tôi như trong, đối với câu hỏi bắt đầu từ đâu, tôi khuyên bạn nên bắt đầu từ các lớp học. Bởi vì nếu bạn có các lớp học của bạn như là một điểm khởi đầu, bạn sẽ không bao giờ cần phải tạo lại các lớp này. Và với thời gian các lớp học của bạn bắt đầu phát triển - bao gồm các phương pháp trợ giúp @XmlTransient, thừa kế, trợ giúp và các chú thích (JPA) khác.

1

Bạn đang ở khá nhiều điểm xuất phát tồi tệ nhất có thể cho JAXB. Ở vị trí của bạn, tôi nghĩ rằng JiBX có thể đặt cược tốt hơn, nó có thể tạo lược đồ từ một mô hình lớp không được chú thích và sau đó kết nối XML trở lại mô hình đối tượng trong thời gian chạy mà không sử dụng chú thích.

+0

JAXB 2 được thiết kế với kịch bản này trong tâm trí. Nếu bạn muốn thể hiện ánh xạ của mình mà không có chú thích, bạn có thể sử dụng các triển khai JAXB như EclipseLink MOXy. –

1

Giải pháp mà chúng tôi đã thực hiện là có một dự án riêng biệt chứa tất cả các mô hình dữ liệu được xác định bởi các lược đồ xml mà từ đó các lớp java được bắt nguồn bằng JAXB. Các dự án khác sử dụng mô hình dữ liệu phụ thuộc vào gói lược đồ này.

Bằng cách này, tất cả "hợp đồng" giữa các dự án được xác định ở một nơi duy nhất, sử dụng biểu diễn xsd di động đẹp mắt. Không cần bất kỳ lớp ánh xạ nào vì chúng ta chỉ sử dụng trực tiếp các JAXB được tạo ra.

2

Reading giữa các dòng, tôi tin rằng sau đây là đúng:

  1. Bạn có mô hình đối tượng mong muốn của bạn.
  2. Bạn có lược đồ XML mong muốn, hoặc ít nhất là một ý tưởng hay về cách bạn muốn nó trông như thế nào.

Kịch bản này thường được gọi là ánh xạ "gặp nhau ở giữa". Nó chỉ được JAXB giải quyết một phần. May mắn vì JAXB là một đặc tả, có những triển khai khác như EclipseLink JAXB (MOXy) mà bạn có thể sử dụng.

MOXY cung cấp một phần mở rộng bản đồ XPath dựa cho phép bạn để ánh xạ giữa mô hình Java bạn có và các lược đồ XML bạn muốn: