2015-06-12 9 views
7

Ciò si verifica perché LocalDate non è un JavaBean (non ha costruttore zero arg)Come mappare il campo java.time.LocalDate con Orika?

Per risolvere questo problema, è necessario creare un LocalDateConverter:

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); 
    } 

} 

e quindi registrarlo aggiungendo questa linea:

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

come scorciatoia, si può invece registrare il "PassThroughConverter" fornito come suggerito da Adam Michalik modo Orika non tenta di instanciate un nuovo "LocalDate":

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

risposta

6

Ciò si verifica perché LocalDate non è un JavaBean (non ha costruttore zero arg)

Per risolvere questo problema, è necessario creare un LocalDateConverter:

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)); 
    } 

} 

e poi registrarlo aggiunta questa linea:

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

Ancora meglio, dal momento che LocalDate è immutabile, non c'è danno nell'utilizzo dello stesso oggetto nei bean di origine e di destinazione. È possibile configurare il MapperFactory come segue:

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

L'origine e la destinazione non sono fagioli, e io non vedo come un oggetto immutabile, potrebbe essere riutilizzato con un nuovo valore dal momento che è "immutabile" (oggetti immutabili sono semplicemente oggetti il ​​cui stato (i dati dell'oggetto) non possono cambiare dopo la costruzione). – Tristan

+0

Hai provato a farlo funzionare con PassThroughConverter? Quello che capisco, non vuoi avere un LocalDate con un nuovo valore: vuoi che il LocalDate di destinazione abbia lo stesso valore del LocalDate di origine. Dato che LocalDate è immutabile, non è necessario creare un nuovo oggetto LocalDate per ottenerlo: puoi utilizzare lo stesso oggetto per target come per source. –

+0

mmm ok, hai ragione, ho dimenticato il mio caso d'uso. Se funziona, la soluzione è più pulita. Non so perché ho scritto "return (LocalDate.from (source))" invece di "return source" – Tristan

Problemi correlati