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:

@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;

  // [...]

}
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.