2015-06-12 8 views
7

Dies geschieht, weil LOCALDATE kein ist JavaBean (es keine Null-arg Konstruktor)Wie man das Feld java.time.LocalDate mit Orika abbildet?

Um dies zu beheben, können Sie eine LocalDateConverter erstellen müssen:

public class LocalDateConverter extends BidirectionalConverter<LocalDate, LocalDate> { 

    @Override 
    public LocalDate convertTo(LocalDate source, Type<LocalDate> destinationType) { 
    return (source); 
    } 

    @Override 
    public LocalDate convertFrom(LocalDate source, Type<LocalDate> destinationType) { 
    return (source); 
    } 

} 

und dann registrieren Sie diese Zeile hinzu:

mapperFactory.getConverterFactory().registerConverter(new LocalDateConverter()); 

als shorcut, können Sie stattdessen die mitgelieferte „PassThroughConverter“ registrieren, wie durch Adam Michalik vorgeschlagen so Orika nicht versucht, ein neues „LOCALDATE“ instanziieren:

Diese
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class)); 

Antwort

6

tritt auf, weil LOCALDATE ist ein nicht JavaBean (es hat keine Null-arg Konstruktor)

Um dies zu beheben, können Sie eine LocalDateConverter erstellen müssen:

public class LocalDateConverter extends BidirectionalConverter<LocalDate, LocalDate> { 

    @Override 
    public LocalDate convertTo(LocalDate source, Type<LocalDate> destinationType) { 
    return (LocalDate.from(source)); 
    } 

    @Override 
    public LocalDate convertFrom(LocalDate source, Type<LocalDate> destinationType) { 
    return (LocalDate.from(source)); 
    } 

} 

und dann registrieren sie das Hinzufügen diese Zeile:

mapperFactory.getConverterFactory().registerConverter(new LocalDateConverter()); 
14

Noch besser ist, da LocalDate unveränderlich ist, gibt es keinen schaden bei der Verwendung des gleichen Objekts in der Quell- und Ziel-Beans. Sie können Ihre MapperFactory wie folgt konfigurieren:

mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class)); 
+0

Die Quelle und das Ziel sind nicht Bohnen, und ich sehe nicht, wie ein unveränderliches Objekt mit einem neuen Wert wiederverwendet werden könnte, da es „unveränderlich“ (Unveränderliche Objekte sind einfach Objekte, deren Zustand (die Daten des Objekts) sich nach der Konstruktion nicht ändern können. – Tristan

+0

Haben Sie versucht, es mit dem PassThroughConverter auszuführen? Was ich verstehe, Sie möchten kein LocalDate mit einem neuen Wert haben - Sie möchten, dass das Ziel LocalDate den gleichen Wert wie das Source LocalDate hat. Da LocalDate unveränderlich ist, müssen Sie kein neues LocalDate-Objekt erstellen, um dies zu erreichen. Sie können dasselbe Objekt für das Ziel wie für die Quelle verwenden. –

+0

mmm ok, du hast Recht, ich habe meinen Anwendungsfall vergessen. Wenn es funktioniert, ist Ihre Lösung sauberer. Ich weiß nicht warum ich "return (LocalDate.from (source))" anstelle von "return source" geschrieben habe – Tristan