JAXB là gì và tại sao tôi sử dụng nó? [đóng cửa]


109

Có một người ở đây thề rằng JAXB là thứ tuyệt vời nhất kể từ khi bánh mì cắt lát. Tôi tò mò muốn xem người dùng Stack Overflow nghĩ trường hợp sử dụng nào dành cho JAXB và điều gì khiến nó trở thành giải pháp tốt hay không tốt cho trường hợp đó.


2
Đọc bài viết này (Kiến trúc Java cho liên kết XML (JAXB)) đây là bài viết tốt nhất. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Câu trả lời:


99

Tôi là một fan hâm mộ lớn của JAXB để sử dụng XML. Về cơ bản, nó cung cấp một giải pháp cho vấn đề này (giả sử tôi đã quen với XML, cấu trúc dữ liệu Java và Lược đồ XML):

Làm việc với XML rất khó. Người ta cần một cách để lấy một tệp XML - về cơ bản là một tệp văn bản - và chuyển đổi nó thành một số loại cấu trúc dữ liệu, mà chương trình của bạn sau đó có thể thao tác.

JAXB sẽ lấy một Lược đồ XML mà bạn viết và tạo một tập hợp các lớp tương ứng với lược đồ đó. Các tiện ích JAXB sẽ tạo ra cấu trúc phân cấp dữ liệu để thao tác với XML đó.

Sau đó, JAXB có thể được sử dụng để đọc tệp XML, và sau đó tạo các phiên bản của các lớp được tạo - chứa đầy dữ liệu từ XML của bạn. JAXB cũng làm ngược lại: nhận các lớp java và tạo ra XML tương ứng.

Tôi thích JAXB vì nó dễ sử dụng và đi kèm với Java 1.6 (nếu bạn đang sử dụng 1.5, bạn có thể tải xuống JAXB .jars.) Cách nó tạo ra hệ thống phân cấp lớp rất trực quan và theo kinh nghiệm của tôi, nó hoạt động khá tốt trừu tượng hóa "XML" để tôi có thể tập trung vào "dữ liệu".

Vì vậy, để trả lời câu hỏi của bạn: Tôi hy vọng rằng, đối với các tệp XML nhỏ, JAXB có thể quá mức cần thiết. Nó yêu cầu bạn tạo và duy trì một lược đồ XML và sử dụng "các phương pháp sách giáo khoa chuẩn" để sử dụng các lớp Java cho cấu trúc dữ liệu. (Các lớp chính, các lớp bên trong nhỏ để đại diện cho các "nút" và một hệ thống phân cấp khổng lồ của chúng.) Vì vậy, JAXB có lẽ không phải là tuyệt vời cho một danh sách tuyến tính đơn giản các "tùy chọn" cho một ứng dụng.

Nhưng nếu bạn có một lược đồ XML khá phức tạp và nhiều dữ liệu chứa trong nó, thì JAXB thật tuyệt vời. Trong dự án của mình, tôi đang chuyển đổi một lượng lớn dữ liệu giữa nhị phân (được sử dụng bởi chương trình C) và XML (để con người có thể sử dụng và sửa đổi dữ liệu đó). Lược đồ XML kết quả là không tầm thường (nhiều mức phân cấp, một số trường có thể được lặp lại, những trường khác thì không) vì vậy JAXB rất hữu ích trong việc có thể thao tác điều đó.


21
JAXB có thể được thực hiện mà không cần XSD. Bạn có thể sử dụng chú thích: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger

7
JAXB là một thông số kỹ thuật (như JPA hoặc JAXP), có nghĩa là có nhiều triển khai (Metro, EclipseLink, v.v.). Nếu bạn gặp sự cố với một cái, bạn có thể chuyển sang cách triển khai khác. Bạn cũng có thể tận dụng các tiện ích mở rộng do các nhà cung cấp khác nhau cung cấp.
bdoughan

@BlaiseDoughan, Metro là một triển khai JAXB ?! Metro không phải là một triển khai WSIT?
Muhammad Gelbana

1
@MuhammadGelbana - Tôi đoán tôi nên gọi nó là Dự án JAXB ( jaxb.java.net ), là một phần của Metro triển khai JAX-WS ( metro.java.net ).
bdoughan

2
FYI, JAXB đang bị loại bỏ khỏi Java SE 11. Xem JEP 320: Loại bỏ các mô-đun Java EE và CORBA . Hành động này đang được thực hiện như một phần của quá trình Mô-đun hóa Java SE và chuyển giao các công nghệ Java EE cho dự án Jakarta EE . Bạn sẽ phải thêm JAXB API và triển khai vào dự án của mình.
Basil Bourque

23

Đây là một lý do để không sử dụng nó: hiệu suất bị ảnh hưởng. Có rất nhiều chi phí khi điều phối và không quản lý. Bạn cũng có thể muốn xem xét một API khác cho liên kết XML-Object - chẳng hạn như JiBX: http://jibx.sourceforge.net/


1
Ngoài ra, hãy cân nhắc sử dụng công cụ XSD2Jibx nếu bạn gặp sự cố với các ràng buộc - nó ở trạng thái "alpha", nhưng nó thực sự hữu ích khi minh họa các lớp và ràng buộc mà nó thích với các lược đồ XSD ... bây giờ, giá như nó ngừng sử dụng SQL date theo mặc định và sử dụng Ngày sử dụng Java thay thế ...
MetroidFan2002

3
Vớ vẩn. JAXB khá nhanh, miễn là bạn sử dụng trình phân tích cú pháp nhanh (như Woodstox), chi phí có thể là 30-40% so với đóng sách thủ công. JiBX ổn, không có vấn đề gì với nó, nhưng sự khác biệt về hiệu suất là không lớn.
StaxMan

6
Tôi đã sử dụng JAXB trong một số dự án và tiếp tục sử dụng nó. Nhưng điều quan trọng là phải hiểu nó như thế nào so với các khuôn khổ khác. Nếu bạn đang sắp xếp / dỡ quản lý các tài liệu có dung lượng hàng trăm megabyte và thời gian là quan trọng - JiBX là một lựa chọn thay thế tốt. JAXB == phản chiếu, JiBX == thiết bị đo mã byte.
codefinger

19

Đó là "ORM cho XML". Hầu hết thường được sử dụng cùng với JAX-WS (và thực sự là các triển khai Mặt trời được phát triển cùng nhau) cho các hệ thống Ngôi sao Tử thần WS.


19

Tôi sử dụng JAXB tại nơi làm việc mọi lúc và tôi thực sự yêu thích nó. Nó hoàn hảo cho các lược đồ XML phức tạp luôn thay đổi và đặc biệt tốt để truy cập ngẫu nhiên các thẻ trong tệp XML.

Tôi ghét ma cô nhưng tôi mới bắt đầu viết blog và đây thực sự là điều đầu tiên tôi đăng về!

Kiểm tra nó tại đây:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/


4
Ví dụ rõ ràng trên blog của bạn. Đã ủng hộ cho điều đó. :-)
Shawn D.

9

Với JAXB, bạn có thể tự động tạo các biểu diễn XML cho các đối tượng của mình (sắp xếp) và các biểu diễn đối tượng của XML (giải nén).

Liên quan đến Lược đồ XML, bạn có hai lựa chọn:

  • Tạo các lớp Java từ XSD
  • Tạo XSD từ các lớp Java của bạn

Ngoài ra còn có một số thư viện tuần tự hóa XML đơn giản hơn như XStream , Digester hoặc XMLBeans có thể là lựa chọn thay thế.


1
Đây không phải là các khuôn khổ ràng buộc, chúng là các thư viện tuần tự hóa. Một khung liên kết tốt có thể ánh xạ bất kỳ XML nào tới một đồ thị đối tượng đẳng hình hoặc quay lại một lần nữa. Các cơ chế tuần tự hóa đơn giản này tạo ra và sử dụng một lược đồ XML không chuẩn, cố định.
erickson ngày

Cảm ơn erickson, tôi chỉ làm việc với JAXB và muốn đảm bảo rằng tôi đề cập đến các lựa chọn thay thế. Tôi sẽ chỉnh sửa câu trả lời của mình dựa trên đầu vào của bạn.
Fabianamondsg

Trên thực tế, mặc dù XStream vẫn ổn, nhưng nó không thực sự đơn giản hơn, vì cả hai đều rất đơn giản. Và Digester KHÔNG đơn giản, chỉ đơn giản.
StaxMan

2
Ai đó hãy đề cập đến JAXB-2.0 bằng cách sử dụng Chú thích. Giữa một vài lớp XmlAdapter, tôi có thể ánh xạ bất kỳ lược đồ nào đến bất kỳ cấu trúc Java hiện có nào.
Mark Renouf

8

JAXB rất tuyệt nếu bạn phải viết mã cho một số đặc tả XML bên ngoài được định nghĩa là một lược đồ XML ( xsd).

Ví dụ: bạn có một ứng dụng giao dịch và bạn phải báo cáo các giao dịch cho Ứng dụng Báo cáo Thương mại Uber Lame và họ đã cấp cho bạn ultra.xsdđể tiếp tục. Sử dụng $JAVA_HOME/bin/xjctrình biên dịch để biến XML thành một loạt các lớp Java (ví dụ UltraTrade).

Sau đó, bạn có thể chỉ cần viết một lớp bộ điều hợp đơn giản để chuyển đổi các đối tượng thương mại của bạn sang UltraTradesvà sử dụng JAXBđể điều phối dữ liệu sang Ultra-Corp. Nhiều dễ dàng hơn rối tung về chuyển đổi ngành nghề của bạn sang định dạng XML của họ.

Tất cả tan vỡ là khi Ultra-Corp không thực sự tuân theo thông số kỹ thuật của riêng họ, và giao dịch pricemà họ xsd:floatthực hiện như một thực tế nên được thể hiện dưới dạng a double!


1
Cũng lưu ý rằng bạn CÓ THỂ làm trước mã: bắt đầu với bean, tạo sơ đồ lược đồ mà bạn cần.
StaxMan

7

Tại sao chúng ta cần JAXB? Các thành phần từ xa (được viết bằng Java) của các dịch vụ web sử dụng XML như một phương tiện để trao đổi các thông điệp giữa nhau. Tại sao lại là XML? Bởi vì XML được coi là tùy chọn có trọng lượng nhẹ để trao đổi thông điệp trên Mạng có tài nguyên hạn chế. Vì vậy, thường chúng ta cần chuyển đổi các tài liệu XML này thành các đối tượng và ngược lại. Ví dụ: Nhân viên POJO Java đơn giản có thể được sử dụng để gửi dữ liệu Nhân viên đến thành phần từ xa (cũng là một chương trình Java).

class Employee{
 String name;
 String dept;
 ....
}

Pojo này nên được chuyển đổi (Marshall) sang tài liệu XML như sau:

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

Và tại thành phần từ xa, quay lại đối tượng Java từ tài liệu XML (Un-Marshall).

JAXB là gì?

JAXB là một thư viện hoặc một công cụ để thực hiện thao tác Marshalling và UnMarshalling này. Nó giúp bạn thoát khỏi cơn đau đầu này, đơn giản như vậy.


4

Bạn cũng có thể kiểm tra JIBX. Nó cũng là một chất kết dính dữ liệu xml rất tốt, cũng chuyên dụng trong OTA (Open Travel Alliance) và được hỗ trợ bởi các máy chủ AXIS2. Nếu bạn đang tìm kiếm hiệu suất và khả năng tương thích, bạn có thể kiểm tra:

http://jibx.sourceforge.net/index.html


0

JAXB cung cấp hiệu suất được cải thiện thông qua tối ưu hóa sắp xếp mặc định. JAXB định nghĩa một API lập trình viên để đọc và ghi các đối tượng Java đến và đi từ các tài liệu XML, do đó đơn giản hóa việc đọc và ghi XML qua Java.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.