JAXB Unmashaller dla klas z Namespace

Ostatnio spotkałem się z dość (nie)ciekawym problemem konwersji XML do Java objektów.
Jeśli uzywasz XML bez Namespace to raczej nie powinno być problemów z wcztaniem dokumentu XML. Sprawa wygląda zgoła inaczej jeśli XML posiada Namespace. komplikuje się dodatkowo, gdy nie możesz edytować schematów (np. XSD).

Ponieważ całość zajęła mi kilka chwil, pomyślałem iż warto się podzielić rozwiązaniem z innymi :)

Poniżej kod, który wcztuje XML do obiektów JAXB.

Ważne: jeśli generujesz obiekty ze schematów, to w paczce gdzie znajdują się wygenerowane klasy musi znajdować się klasa ObjectFactory. Większośc generatorów generuje ObjectFactory w domyślnych ustawieniach.


import org.w3c.dom.Document;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class JaxbUnmashaller {
public T unmarshal(Class declaredType, File file) {
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(file);

JAXBContext context = JAXBContext.newInstance(declaredType);
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement jaxbElement = unmarshaller.unmarshal(doc, declaredType);

return (T) jaxbElement.getValue();
}
catch (Exception blad) {
throw new RuntimeException(blad);
}
}
}

Informacje o @albgorski

Od 1999 roku profesjonalnie zajmuję się rozwijaniem oprogramowania. Głównie Java, ale także Groovy, PHP, HTML, JavaScript oraz Adobe Flex. Fascynują mnie metody wymiany danych, ich przechowywania oraz dostępowania. Jestem WIELKIM zwolennikiem Clean Code, TDD oraz agilistą (może lepiej lean-istą). Ekosystem Java dostarcza WIELE świetnych frawework-ów i bibliotek, a społeczność miłośników języka Java jest najlepsza pod słońcem :)
Ten wpis został opublikowany w kategorii inżynieria opogramowania, java i oznaczony tagami , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Możliwość komentowania jest wyłączona.