Entity Beans --> XML

Java4U

Grünschnabel
Hi,

Ich versuche gerade einen XML Export und Import für EntityBeans(EJB3) zu schreiben. Bisher habe ich mit dem dom4j Framework ein Document erstellt das die entsprechenden XML Tags mit den Variablen Werten hierarchisch aufgebaut hat. Außerdem habe ich eine Annotation geschrieben, die ich vor eine exportierbare Variable schreibe, so dass nicht alles exportiert wird.

Beim Import ist das nun ein bischen komplizierter, da in einer Entity wieder mehrere Entities enthalten sein können. Um die Daten aus der XML-Datei zwischenzuspeichern musste ich mir nun wohl ein Object zusammenschustern, das dann die Daten in Hierarchischer Form meiner persist(Object o) Methode übergiebt.

Gibt es dafür nicht irgend ein Standardobject?

Oder hat jemand einen anderen Vorschlag?

Ich habe mir auch schon mal das JAXB Framework angeschaut. Allerdings scheinen hier alle Variablen exportiert zu werden. Daher eher unbrauchbar, da ich nicht alle Daten exportieren darf.

Gruß

Michael
 
Bei JAXB kannst du sehr feingranular regeln was raus soll und was nicht. @XmlTransient schützt beim Export in XML davor, dass Daten im XML Dokument landen. Beim Import ist das ja eh kein Thema.

Gruß
Ollie
 
Danke,
ja bei meinem ersten Versuch mit JAXB bin ich da auch drauf gestoßen, habe das aber leider überlesen.
Ich dachte Transient ist nur für Namenskonflikte. Tja wer Lesen kann ist ... :mad:

Aber klar so klappt das ganze

Gruß

Michael
 
Mir ist gerade aufgefallen, dass @XmlTransient nicht auf Field Ebene funktioniert. Ich habe mir blöderweise angewöhnt die Variablen zu annotieren.
Bei XmlTransient funktioniert das nur auf Methodenebene über die Getter Methode.

Code:
@XmlRootElement(namespace = "Test")
class Test1 implements Serializable {
    private static final long serialVersionUID = 7234981453138267121L;
    @XmlTransient
    private String test1 = "Hallo";
    private int test2 = 42;

   
    /**
     * @return the test1
     */
    public String getTest1() {
        return test1;
    }

    /**
     * @param test1 the test1 to set
     */
    public void setTest1(String test1) {
        this.test1 = test1;
    }

    /**
     * @return the test2
     */
    public int getTest2() {
        return test2;
    }

    /**
     * @param test2 the test2 to set
     */
    public void setTest2(int test2) {
        this.test2 = test2;
    }

}

liefert:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:test1 xmlns:ns2="Test">
    <test1>Hallo</test1>
    <test2>42</test2>
</ns2:test1>

und

Code:
@XmlRootElement(namespace = "Test")
class Test1 implements Serializable {
    private static final long serialVersionUID = 7234981453138267121L;

    private String test1 = "Hallo";
    private int test2 = 42;

    /**
     * @return the test1
     */
    @XmlTransient
    public String getTest1() {
        return test1;
    }

    /**
     * @param test1 the test1 to set
     */
    public void setTest1(String test1) {
        this.test1 = test1;
    }

    /**
     * @return the test2
     */
    public int getTest2() {
        return test2;
    }

    /**
     * @param test2 the test2 to set
     */
    public void setTest2(int test2) {
        this.test2 = test2;
    }

}

liefert:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:test1 xmlns:ns2="Test">
    <test2>42</test2>
</ns2:test1>


obwohl das ganze in der API mit
Code:
@Retention(value=RUNTIME)
@Target(value={FIELD,METHOD})
public @interface XmlTransient

beschrieben ist

:mad:
 
JAXB erwartet die Annotationen standardmäßig an den gettern da es standardmäßig auch die Rückgabewerte serialisiert. Man kann es auf Feldebene umstellen indem man die Klasse mit
@XmlAccessorType(XmlAccessType.FIELD) annotiert, damit teilt man JAXB mit auf Feldebene zu serialisieren und muss somit die Annotationen an die Felder kleben.
 

Neue Beiträge

Zurück