2014-11-23 13 views
16

ho la seguente classe che voglio conservare in MongoDB usando primavera datiConservare Java 8 Immediata la data BSON utilizzando SpringData-MongoDB

@Document() 
public class Tuple2<T extends Enum<T>> { 

@Id 
private String id; 

@Indexed 
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
private final Instant timeCreated; 

... 
} 

DateTimeFormat stati annotazione javadoc:

dichiari che un il campo deve essere formattato come data. Supporta la formattazione in base a pattern di stile, pattern di data e ora ISO o stringa di modello di formato personalizzato. Può essere applicato ai tipi di valore java.util.Date, java.util.Calendar, java.long.Long, Joda-Time; e da Spring 4 e JDK 8, anche ai tipi java.time di JSR-310.

Sto utilizzando Spring 4.1.1 e JDK 8, quindi mi aspetto che si applica a Instant. Tuttavia, ecco cosa effettivamente memorizzata:

"timeCreated" : { 
    "seconds" : NumberLong(1416757496), 
    "nanos" : 503000000 
} 

Se scrivo e registro convertitore personalizzato da istantaneo a come Data spiegato in this answer allora funziona, però vorrei evitare che, come sono sicuro che ci deve essere un modo migliore.

Dopo ulteriori scavare nel codice sorgente primavera ho trovato la seguente classe Jsr310DateTimeFormatAnnotationFormatterFactory che sembra essere molto promettente:

campi Formati annotati con l'annotazione DateTimeFormat utilizzando il pacchetto java.time JSR-310 in JDK 8.

La sua 'fonte non fa riferimento a Instant, ma fa riferimento a OffsetTime e LocalTime. Anche così, quando cambio Instant in OffsetDateTime nel mio esempio, è ancora memorizzato come oggetto composito invece di ISODate.

Cosa manca?

risposta

4

Penso che il problema è quello che si sta tentando di utilizzare Instant come una volta. Concettualmente è un punto della timeline e non implica la formattazione.

Come sappiamo, Java 8 time API è stato sviluppato con un occhio di riguardo a joda-time (e con la partecipazione degli sviluppatori di joda-time). Ecco commento da Joda tempo Instant:

un istante deve essere utilizzato per rappresentare un punto nel tempo indipendentemente da qualsiasi altro fattore, come ad esempio la cronologia o il fuso orario.

Ecco perché non ci sono possibilità di formattazione per org.joda.time.Instant in JodaDateTimeFormatAnnotationFormatterFactory apparsi in primavera a partire dalla versione 3.0. Inoltre, non è stato implementato in Jsr310DateTimeFormatAnnotationFormatterFactory

Quindi, è necessario utilizzare un convertitore personalizzato o considerare di utilizzare una classe più adatta.

+0

Sembra ragionevole. Esiste tuttavia 'OffsetDateTime' in' Jsr310DateTimeFormatAnnotationFormatterFactory', ma non è formattato pure – Vic

+0

L'annotazione @Vic DateTimeFormat non è responsabile della formattazione in memoria (mongodb). Funziona a livello di applicazione (ad es. Formattazione su pagine JSP). Esistono convertitori per convertire i dati in un tipo appropriato. Ho trovato solo 'ZonedDateTimeToCalendarConverter' per Java 8 time API. Quindi puoi provare a usare ZonedDateTime? – retroq

Problemi correlati