JaxB - speichern vom Typ "Object"

beta20

Top Contributor
Hallo,

ich möchte gerne in meiner XML jegliche Dateitypen speichern.

Hierzu verwende ich derzeit:

Java:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Condition {

   private Object valueObject;
    
}

Nun habe ich aber Probleme zB bei LocalDate, da ich hier scheinbar einen Converter benötige, denn hier bekomme ich bspw. diese Meldung:
Caused by: java.lang.NoSuchMethodError: java.time.LocalDate.<init>()

Die Frage ist nun also, wie kann ich jegliche Dateitypen hier reinschreiben?
 
Bekommst du ein Problem wenn du das XML scheiben willst oder wenn du es lesen willst? Beim schreiben müsste es gehen, allerdings kommt da natürlich je nach Objekt grober Unfug raus, weil maximal die toString Methode aufgerufen werden kann.
 
Bekommst du ein Problem wenn du das XML scheiben willst oder wenn du es lesen willst? Beim schreiben müsste es gehen, allerdings kommt da natürlich je nach Objekt grober Unfug raus, weil maximal die toString Methode aufgerufen werden kann.
Korrekt. Schreiben geht...
Beim Lesen kommt dann eben das folgende Problem:
Caused by: java.lang.NoSuchMethodError: java.time.LocalDate.<init>()

Wie kann ich das lösen?
 
Konverter defnieren für jeden Datentyp, der da drinstecken. Das kann anders nicht funktionieren. Du bekommst String reins - wie die auf den konkreten Objekt-Datentyp mappen, dafür brauchst einen Converter, das kann nicht magisch von selber klappen.
 
Du meinst sowas hier, welches ich für LocalDateTime habe

Java:
public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {

    public LocalDateTime unmarshal(String v) throws Exception {
        return LocalDateTime.parse(v);
    }

    public String marshal(LocalDateTime v) throws Exception {
        return v.toString();
    }
}


also dann sowas:
Java:
public class Object extends XmlAdapter<String, Object> {

    public Object unmarshal(Object v) throws Exception {
???????     

  if(v instanceof String)
      return v;

  if(v instanceof LocalDateTime)
        return LocalDateTime.parse(v);
    }

    public String marshal(Object v) throws Exception {
        return v.toString();
    }
}

Alternativ habe versucht mehrere Adapter zu nehmen, das geht aber nicht, man kann nur einen Adapter definieren...
Java:
    // Values
    @XmlJavaTypeAdapter(LocalDateTimeAdapter.class, LocalDateTimeAdapter.class)
    private Object valueObject;
 
Zuletzt bearbeitet:
Das kann grundsätzlich doch eh nicht funktionieren, was du willst - du musst schon mit mehr Typ Informationen arbeiten. Wenn du zwei Klassen hast, die die selbe String Darstellung haben, woher soll JAXB wissen, welche Klasse die richtige ist, beim unmarshallen?
 
Die Adapter kann man übrigens in der package-info definieren:

Java:
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({ //
        @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value = LocalDateAdapter.class), //
        @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value = LocalDateTimeAdapter.class), //
        @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value = MonthDayAdapter.class), //
})
Allerdings muss jede Klasse, die du in das XML stecken willst, dann auch entsprechend mit XML-Annotationen versehen sein - sonst klappt der Ansatz nicht.

Der Ansatz bei einem DTO Modell ist in der Regel ja nicht nicht mit "Objekt" zu arbeiten, sondern mit konkreten Typen.
 

Zurück
Oben