@XmlRootElement(name = "Vertrag")
public class Vertrag {
@XmlElement(name = "wohnflaeche", nillable = true)
private Integer wohnflaeche;
@XmlJavaTypeAdapter(value = LocalDateAdapter.class) (1)
@XmlAttribute(name = "verkaufsStart")
private LocalDate verkaufsStart;
@XmlElement(name = "Deckung", type = org.faktorips.beispiel.modell.Deckung.class)
@XmlElementWrapper(name = "Deckungen")
private List<Deckung> deckungen;
@XmlJavaTypeAdapter(value = ProductConfigurationXmlAdapter.class)
@XmlAttribute(name = "product-component.id")
private ProductConfiguration productConfiguration;
// [...]
}
Generatoroptionen
JAXB-Support
Ist die Einstellung generateJaxbSupport
auf true
gestellt werden in allen Vertragsklassen JAXB-Annotationen generiert.
JAXB[1] ist ein Framework, um Objekte als XML zu de-/serialisieren. Dazu werden Annotationen an Klassen und Felder generiert:
1 | Der LocalDateAdapter wird bei Verwendung der Java-8-Variante des LocalDate generiert, für die veraltete Joda-Time-Variante muss ein eigener Adapter angelegt werden. |
Um die dabei referenzierten Adapter (die JAXB nutzt, um komplexe Datentypen zu String-Repräsentationen zu mappen) muss ein spezieller JAXB-Context erstellt werden. Dies geschieht über die Methode newJAXBContext()
am Runtime-Repository:
// muss auch Modell-Repositories referenzieren
private IRuntimeRepository repository; (1)
private JAXBContext jaxbContext = repository.newJAXBContext();
private String toXml(Object obj) throws JAXBException {
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); (2)
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.toString();
}
private Object fromXml(String xml) throws JAXBException {
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setAdapter(new
ProductConfigurationXmlAdapter(repository));
return unmarshaller.unmarshal(new StringReader(xml));
}
1 | Das Repository muss die verwendeten Produkte beinhalten aber auch ggf. diesen zu Grunde liegende Modellprojekte referenzieren |
2 | Wenn das XML auch von Menschen, z.B. beim Debugging, gelesen wird ist eine Formatierung sinnvoll. |