Co to jest JAXB i dlaczego miałbym go używać? [Zamknięte]

109

Jest tu facet, który przysięga, że ​​JAXB to najlepsza rzecz od czasów krojonego chleba. Jestem ciekawy, co użytkownicy Stack Overflow uważają za przypadek użycia dla JAXB i co sprawia, że ​​jest to dobre lub złe rozwiązanie w tym przypadku.

Jay R.
źródło
2
Przeczytaj ten artykuł (Java Architecture for XML Binding (JAXB)), ten jest najlepszy. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Odpowiedzi:

99

Jestem wielkim fanem JAXB do manipulowania XML. Zasadniczo zapewnia rozwiązanie tego problemu (zakładam znajomość XML, struktur danych Java i schematów XML):

Praca z XML jest trudna. Potrzebny jest sposób na pobranie pliku XML - który jest w zasadzie plikiem tekstowym - i przekonwertowanie go na jakąś strukturę danych, którą twój program może następnie manipulować.

JAXB weźmie napisany przez Ciebie schemat XML i utworzy zestaw klas odpowiadających temu schematowi. Narzędzia JAXB utworzą hierarchię struktur danych do manipulowania tym XML.

JAXB może być następnie użyty do odczytania pliku XML, a następnie utworzenia instancji wygenerowanych klas - obciążonych danymi z Twojego XML. JAXB robi również odwrotnie: pobiera klasy java i generuje odpowiedni XML.

Lubię JAXB, ponieważ jest łatwy w użyciu i zawiera Javę 1.6 (jeśli używasz 1.5, możesz pobrać JAXB .jars). Sposób, w jaki tworzy hierarchię klas, jest intuicyjny, az mojego doświadczenia dobrze się spisuje abstrahując od „XML”, abym mógł skupić się na „danych”.

A więc odpowiadając na twoje pytanie: spodziewałbym się, że w przypadku małych plików XML JAXB może być przesadą. Wymaga tworzenia i utrzymywania schematu XML oraz używania „standardowych metod podręcznikowych” wykorzystywania klas Java do struktur danych. (Klasy główne, małe klasy wewnętrzne reprezentujące „węzły” i ogromna ich hierarchia). Tak więc JAXB prawdopodobnie nie jest zbyt dobry dla prostej liniowej listy „preferencji” dla aplikacji.

Ale jeśli masz dość złożony schemat XML i zawiera wiele danych, to JAXB jest fantastyczny. W moim projekcie konwertowałem duże ilości danych między binarnymi (które były używane przez program w C) a XML (aby ludzie mogli je konsumować i modyfikować). Wynikowy schemat XML był nietrywialny (wiele poziomów hierarchii, niektóre pola można było powtarzać, inne nie), więc JAXB był pomocny w manipulowaniu tym.

poundifdef
źródło
21
JAXB można zrobić bez XSD. Możesz użyć adnotacji: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger
7
JAXB to specyfikacja (jak JPA lub JAXP), co oznacza, że ​​istnieje wiele implementacji (Metro, EclipseLink itp.). Jeśli masz z którymś problem, możesz przełączyć się na inną implementację. Możesz także skorzystać z rozszerzeń oferowanych przez różnych dostawców.
bdoughan
@BlaiseDoughan, Metro to implementacja JAXB ?! Czy Metro nie jest implementacją WSIT?
Muhammad Gelbana,
1
@MuhammadGelbana - chyba powinienem nazwać go Projektem JAXB ( jaxb.java.net ), który jest częścią Metro implementacji JAX-WS ( metro.java.net ).
bdoughan
2
FYI, JAXB jest usuwane z Java SE 11. Zobacz JEP 320: Usuwanie modułów Java EE i CORBA . To działanie jest podejmowane w ramach Modularyzacji Java SE i przekazania technologii Java EE do projektu Jakarta EE . Będziesz musiał dodać JAXB API i implementację do swojego projektu.
Basil Bourque,
23

Oto powód, aby go nie używać: cierpi na tym wydajność. Podczas organizowania i cofania kaucji jest dużo kosztów ogólnych. Możesz również rozważyć inny interfejs API do wiązania obiektów XML - na przykład JiBX: http://jibx.sourceforge.net/

codefinger
źródło
1
Rozważ także użycie narzędzia XSD2Jibx, jeśli masz problemy z powiązaniami - jest w stanie „alfa”, ale jest naprawdę pomocne w zilustrowaniu klas i powiązań, które lubi, w schematach XSD ... teraz, gdyby tylko domyślnie przestało używać daty SQL i zamiast tego używał Java util Date ...
MetroidFan2002
3
Głupie gadanie. JAXB jest dość szybki, o ile używasz szybkiego parsera (takiego jak Woodstox), narzut może wynosić około 30-40% w porównaniu do ręcznego wiązania. JiBX jest w porządku, nie ma z tym problemu, ale różnica w wydajności nie jest duża.
StaxMan
6
Używałem JAXB w kilku projektach i nadal go używam. Ale ważne jest, aby zrozumieć, jak wypada w porównaniu z innymi frameworkami. Jeśli organizujesz / cofasz dokumenty, które mają setki megabajtów, a czas jest ważny - JiBX jest dobrą alternatywą. JAXB == odbicie, JiBX == instrumentacja kodu bajtowego.
codefinger
19

To jest „ORM dla XML”. Najczęściej używany wraz z JAX-WS (i faktycznie implementacje Sun są opracowywane razem) dla systemów WS Death Star.

Tom Hawtin - haczyk
źródło
19

W pracy używam JAXB cały czas i naprawdę to uwielbiam. Jest idealny do złożonych schematów XML, które zawsze się zmieniają, a szczególnie nadaje się do swobodnego dostępu do tagów w pliku XML.

Nienawidzę alfonsować, ale właśnie założyłem bloga i jest to dosłownie pierwsza rzecz, o której pisałem!

Sprawdź to tutaj:

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

artgon
źródło
4
Wyraźny przykład na swoim blogu. Głosowano za tym. :-)
Shawn D.
9

Z JAXB możesz automatycznie tworzyć reprezentacje XML swoich obiektów (krosowanie) i reprezentacje obiektów XML (unmarshalling).

Jeśli chodzi o schemat XML, masz dwie możliwości:

  • Generuj klasy Java z XSD
  • Wygeneruj XSD z klas Java

Istnieją również prostsze biblioteki serializacji XML jak XStream , fermentacyjnej lub XMLBeans które mogą być alternatywy.

Fabian Steeg
źródło
1
To nie są wiążące struktury, są to biblioteki serializacji. Dobra struktura powiązania może mapować dowolny kod XML na izomorficzny graf obiektu lub odwrotnie. Te proste mechanizmy serializacji tworzą i używają ustalonego, niestandardowego schematu XML.
erickson
Dzięki erickson, pracowałem tylko z JAXB i chciałem mieć pewność, że wspomnę o alternatywach. Zmienię odpowiedź na podstawie Twoich danych.
Fabian Steeg
Właściwie, chociaż XStream jest w porządku, nie jest to tak naprawdę prostsze, ponieważ oba są bardzo proste. Digester NIE jest prosty, tylko uproszczony.
StaxMan
2
Niech ktoś wspomina o JAXB-2.0 za pomocą adnotacji. Pomiędzy kilkoma klasami XmlAdapter, mogę odwzorować dowolny schemat na dowolną istniejącą strukturę Java.
Mark Renouf
8

JAXB jest świetny, jeśli musisz kodować według jakiejś zewnętrznej specyfikacji XML zdefiniowanej jako schemat XML ( xsd).

Na przykład, masz aplikację handlową i musisz zgłosić transakcje do aplikacji Uber Lame Trade Reporting, a oni dali ci ultra.xsddo zrobienia. Użyj $JAVA_HOME/bin/xjckompilatora, aby przekształcić XML w kilka klas Java (np UltraTrade.).

Następnie możesz po prostu napisać prostą warstwę adaptera , aby przekonwertować obiekty handlowe na UltraTradesi użyć JAXBdo kierowania danych do Ultra-Corp. O wiele łatwiejsze niż kłopoty z konwersją transakcji do ich formatu XML.

Tam, gdzie wszystko się psuje, jest sytuacja, gdy Ultra-Corp faktycznie nie przestrzega swoich własnych specyfikacji, a handel, pricektóry mają jako a, xsd:floatpowinien być wyrażony jako double!

oxbow_lakes
źródło
1
Pamiętaj również, że MOŻESZ najpierw wykonać kod: zacznij od fasoli, wygeneruj schemat, jeśli go potrzebujesz.
StaxMan
7

Dlaczego potrzebujemy JAXB? Zdalne komponenty (napisane w Javie) usług sieciowych wykorzystują XML jako środek do wymiany komunikatów między sobą. Dlaczego XML? Ponieważ XML jest uważany za lekką opcję wymiany wiadomości w sieciach z ograniczonymi zasobami. Tak często musimy przekonwertować te dokumenty XML na obiekty i odwrotnie. Np .: Prosta Java POJO Pracownik może być używana do wysyłania danych Pracownika do zdalnego komponentu (także programu Java).

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

To Pojo powinno zostać przekonwertowane (Marshall) na dokument XML w następujący sposób:

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

A w komponencie zdalnym z powrotem do obiektu Java z dokumentu XML (Un-Marshall).

Co to jest JAXB?

JAXB to biblioteka lub narzędzie do wykonywania tej operacji Marshallingu i UnMarshalling. To oszczędza ci tego bólu głowy, tak prostego.

Prashant_M
źródło
4

Możesz także sprawdzić JIBX. Jest to również bardzo dobry segregator danych xml, który również specjalizuje się w OTA (Open Travel Alliance) i jest obsługiwany przez serwery AXIS2. Jeśli szukasz wydajności i kompatybilności, możesz to sprawdzić:

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

LostMohican
źródło
0

JAXB zapewnia lepszą wydajność dzięki domyślnej optymalizacji krosowania. JAXB definiuje programistyczny interfejs API do odczytywania i zapisywania obiektów Java do iz dokumentów XML, upraszczając w ten sposób odczytywanie i zapisywanie XML za pośrednictwem języka Java.


źródło