Jestem nowy w używaniu JAXB i użyłem xjc JAXB 2.1.3 do wygenerowania zestawu klas z mojego schematu XML. Oprócz wygenerowania klasy dla każdego elementu w moim schemacie, utworzono klasę ObjectFactory.
Wydaje się, że nic nie powstrzymuje mnie przed bezpośrednim tworzeniem instancji elementów, np
MyElement element = new MyElement();
podczas gdy samouczki wydają się preferować
MyElement element = new ObjectFactory().createMyElement();
Jeśli zajrzę do ObjectFactory.java, widzę:
public MyElement createMyElement() {
return new MyElement();
}
więc o co chodzi? Dlaczego miałbym w ogóle zawracać sobie głowę utrzymywaniem klasy ObjectFactory? Zakładam, że zostanie on również nadpisany, gdybym miał ponownie skompilować ze zmienionego schematu.
Odpowiedzi:
Kompatybilność wsteczna nie jest jedynym powodem. :-P
W przypadku bardziej skomplikowanych schematów, takich jak te, które mają skomplikowane ograniczenia dotyczące wartości, jakie może przyjąć zawartość elementu, czasami trzeba utworzyć rzeczywiste
JAXBElement
obiekty. Zwykle nie są one łatwe do wykonania ręcznie, więccreate*
metody wykonują ciężką pracę za Ciebie. Przykład (ze schematu XHTML 1.1):Oto jak
<style>
umieścić tag w<head>
tagu:Pierwsze trzy zastosowania
ObjectFactory
można by uznać za zbędne (choć przydatne dla spójności), ale czwarte z nich sprawia, że JAXB jest dużo, dużo łatwiejszy w użyciu. Wyobrazić sobie koniecznośćnew JAXBElement
ręcznego wypisywania za każdym razemźródło
Jak zauważył @Chris, czasami JAXB nie może współpracować z POJO, ponieważ schemat nie może być dokładnie odwzorowany na Javę. W takich przypadkach
JAXBElement
obiekty opakowujące są niezbędne, aby zapewnić dodatkowe informacje o typie.Są dwa konkretne przykłady, z którymi się spotkałem, gdzie jest to powszechne.
Jeśli chcesz zorganizować obiekt klasy, która nie ma
@XmlRootElement
adnotacji. Domyślnie XJC generuje tylko@XmlRootElement
dla niektórych elementów, a nie dla innych. Dokładna logika tego jest nieco skomplikowana, ale możesz zmusić XJC do wygenerowania większej liczby@XmlRootElement
klas przy użyciu „trybu prostego wiązania”Kiedy Twój schemat używa grup podstawników. Jest to dość zaawansowane użycie schematu, ale XJC tłumaczy grupy podstawień na Javę, intensywnie wykorzystując
JAXBElement
opakowania.Tak więc w modelu obiektowym wygenerowanym przez XJC, który intensywnie wykorzystuje
JAXBElement
(z jakiegokolwiek powodu), potrzebujesz sposobu konstruowania tychJAXBElement
instancji. WygenerowanyObjectFactory
jest zdecydowanie najłatwiejszym sposobem na zrobienie tego. Możesz je zbudować samodzielnie, ale jest to niezgrabne i podatne na błędy.źródło
Wydaje mi się, że kompatybilność wsteczna ...
http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :
źródło