Raupen-mapping von java.lang.Datum (als Map-Feld) XMLGregorianCalendar
Ich habe eine xml-Zuordnung definiert:
<mapping>
<class-a>java.util.HashMap</class-a>
<class-b>com.example.MyClass</class-b>
<field>
<a key="myDateField">this</a>
<b>myXMLGregorianCalendarField</b>
</field>
</mapping>
Hier Wert für den Schlüssel myDateField
enthält Instanz von java.lang.Date class
.
Feld com.example.MyClass#myXMLGregorianCalendarField
erwartet Instanz von javax.xml.datatype.XMLGregorianCalendar
.
Diese Zuordnung wirft immer eine exception:
MapId: null
Type: null
Source parent class: java.util.HashMap
Source field name: this
Source field type: class java.util.Date
Source field value: Thu Jan 01 03:00:00 MSK 1970
Dest parent class: com.example.MyClass
Dest field name: myXMLGregorianCalendarField
Dest field type: javax.xml.datatype.XMLGregorianCalendar
org.dozer.MappingException: Illegal object type for the method 'setMyXMLGregorianCalendarField'.
Expected types:
javax.xml.datatype.XMLGregorianCalendar
Actual types:
java.util.Date
, Wie man diese Umwandlung richtig funktioniert?
Hinweis
Lange-lange-debugging ergab, dass primitive Wandler sind unterschiedlich bezeichnet für die Karten und der "nicht-Karten". So, hier kommt die zweite Frage: warum?
- Sagen Sie, dass die Konvertierung funktioniert nur, wenn die
Date
ist nicht eine Karte Feld? - Yep, u got it right. Die Umwandlung funktioniert nur gut, wenn
Date
ist nicht einMap
Feld.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, was du meinst im letzten Abschnitt, aber Sie können versuchen, mithilfe einer benutzerdefinierten setter in der Ziel-Klasse zur Durchführung dieser Zuordnung.
Ihre mapping-Datei würde wie folgt Aussehen:
Implementieren von benutzerdefinierten setter in
MyClass
, vielleicht mit Hilfe einer conversion wie diese.com.example.MyClass#setMyXMLGregorianCalendarField(java.util.Date)
erhältlich. Nurcom.example.MyClass#setMyXMLGregorianCalendarField(javax.xml.datatype.XMLGregorianCalendar)
vorhanden ist. 2) Dozer ist im LieferumfangXMLGregorianCalendarConverter
welche gut funktioniert, wenn source-Objekt (definiert durch<class-a>
tag) ist nicht jede Instanz vonMap
MyClass
ist Klasse. Die andere option besteht in der Implementierung einer benutzerdefinierten Konverter erweitern dieDozerConverter
Klasse, wie beschrieben, hierXMLGregorianCalendarConverter
verlängert nicht dieDozerConverter
Klasse für solche Fälle. Bitte akzeptieren Sie meine Antwort, wenn es dir geholfen 🙂Können Sie versuchen, das hint-tag, um implizit konvertieren von Datum zum Gregorianischen.
Hier ist ein Beispiel-code:
Ich weiß nicht, ob die Raupen die implizite Typ-Konvertierung oder nicht , aber wenn es funktioniert , dann brauchen Sie nicht zu schreiben exta benutzerdefinierten Konverter-Methode.
Im Fall , dass es nicht der Durchführung einer impliziten Konvertierung, versuchen Sie benutzerdefinierte getter-oder setter-Methode.
in denen das Datum auf GregorianCalendar-Konvertierung.
Finden Sie das für custom getter-und setter-Methoden : custom getter-setter
Oops, ich fand die Antwort hier
Automatische Konvertierung dozer
Unter diesem Blick an Dritte Letzte option in der Datentyp-Konvertierung überschrift. Sie schrieb diese zugeordnet werden kann, die intern ohne custom-Converter-Hilfe : java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Kalender, java.util.GregorianCalendar