/ / Wie JAXB-Marshall JavaFX-Eigenschaft Klassen, wenn die Klasse XmlAccessType.NONE ist? - Java, Jaxb, abstrakte Klasse, Marshalling

Wie JAXB-marshall JavaFX-Eigenschaft-Klassen, wenn die Klasse XmlAccessType.NONE ist? - Java, Jaxb, abstrakte Klasse, Marshalling

Ich möchte eine Java-Klasse, die JavaFX enthältEigenschaftsobjekte (DoubleProperty, StringProperty, IntegerProperty), die mit Hilfe des JAXB "s marshall () -Methodenaufrufs in eine XML-Datei geschrieben werden. Diese Klasse enthält jedoch viele Daten, die nicht in das XML geschrieben werden sollen. Diese Klasse wird erwartet Von Entwicklern oft geändert, also bevorzuge ich es, die Klasse "@XmlAccessorType (XmlAccessType.NONE)" zu markieren und dann @XmlElement-Tags zu allem hinzuzufügen, was ich in XML schreiben möchte (also fügt ein Entwickler nicht einige neue Member-Variablen in diese Klasse ein und dann versehentlich das Format der XML-Datei ändern.

Ich sehe Beispiele wie http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html, aber keiner von ihnen hat"@XmlAccessorType (XmlAccessType.NONE)" für ihre Hauptklasse. Wenn ich dieses Tag zu meiner Klasse hinzufüge, erhalte ich entweder Runtime-Exceptions (weil JAXB kein neues Objekt erzeugen kann) oder ein leeres XML-Tag in der Ausgabe (weil JAXB ein Standardobjekt von Omega-Art erstellt hat, aber nicht den gewünschten Wert eingegeben hat) Ich habe Versuche mit Dutzenden von @ Xml * -Tag-Kombinationen, aber ich kann keine finden, die funktionieren.

Beachten Sie, dass ich keine der DoubleProperty / SimpleDoubleProperty-Klassen annotieren kann, da sie Teil der Standard-Java-API sind.

Hier ist ein Codebeispiel, das demonstriertProbleme beim Abrufen der bankAccountBalance-Eigenschaft in die XML-Datei. (Sie können die anderen Daten ignorieren - ich begann mit dem Code von Blaise Doughan als Ausgangspunkt für dieses Beispiel).

package Demo2;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

public class Demo2 {

public static void main(String[] args) throws Exception {
Customer customer = new Customer();
Address address = new Address();
address.setStreet("1 A Street");
customer.setContactInfo(address);
customer.setBankAccountBalance(123.45);
JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class, PhoneNumber.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}

abstract class ContactInfo {
}

class Address extends ContactInfo {
private String street;

public String getStreet() {
return street;
}

public void setStreet(String street) {
this.street = street;
}
}

class PhoneNumber extends ContactInfo {
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
class Customer {
@XmlElement
private ContactInfo contactInfo;
// This tag runs OK but always outputs an empty XML tag ("<bankAccountBalance/>") regardless of the real value.
//    @XmlElement
// This tag causes the following error:
//     Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
//     Invalid @XmlElementRef : Type "class javafx.beans.property.DoubleProperty" or any of its subclasses are not known to this context.
//    @XmlElementRef
// This tag causes the following error:
//     Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
//     Invalid @XmlElementRef : Type "class javafx.beans.property.SimpleDoubleProperty" or any of its subclasses are not known to this context.
//    @XmlElementRef(type=SimpleDoubleProperty.class)
private DoubleProperty bankAccountBalance;

public Customer() {
bankAccountBalance = new SimpleDoubleProperty(0);
}

public ContactInfo getContactInfo() {
return contactInfo;
}

public void setContactInfo(ContactInfo contactInfo) {
this.contactInfo = contactInfo;
}

public double getBankAccountBalance() {
return bankAccountBalance.get();
}

public void setBankAccountBalance(double bankAccountBalance) {
this.bankAccountBalance.set(bankAccountBalance);
}
}

Antworten:

2 für die Antwort № 1

Beschriften Sie einfach den Getter und nicht das DoubleProperty-Feld, das die Javafx-Klasse umgeht. Vergessen Sie nicht, Value zu setzen, damit Sie das Ergebnis sehen.

@ XmlElement öffentliches double getBankAccountBalance () { Rückgabe bankAccountBalance.get (); }