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?
Sembra ragionevole. Esiste tuttavia 'OffsetDateTime' in' Jsr310DateTimeFormatAnnotationFormatterFactory', ma non è formattato pure – Vic
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