![](/img/trans.png)
[英]Mongo auditable ZonedDateTime fields don't work in Spring Boot 2
[英]Register a new Date Converter Auditable in Spring Data MongoDB for ZonedDateTime
我希望我的可審計( @CreatedDate
和@LastModifiedDate
)MongoDB文檔與ZonedDateTime
字段一起使用。
顯然,Spring Data不支持這種類型(請查看org.springframework.data.auditing.AnnotationAuditingMetadata
)。
框架版本: Spring Boot 2.0.0和Spring Data MongoDB 2.0.0
java.lang.IllegalArgumentException: Invalid date type for member <MEMBER NAME>!
Supported types are [org.joda.time.DateTime, org.joda.time.LocalDateTime, java.util.Date, java.lang.Long, long].
@Configuration
@EnableMongoAuditing
public class MongoConfiguration {
}
public abstract class BaseDocument {
@CreatedDate
private ZonedDateTime createdDate;
@LastModifiedDate
private ZonedDateTime lastModifiedDate;
}
我也嘗試為ZonedDateTime
創建自定義轉換器,但Spring Data不考慮它。 類DateConvertingAuditableBeanWrapper
具有ConversionService
其在與所述構造方法構造JodaTimeConverters
, Jsr310Converters
和ThreeTenBackPortConverters
。
@Component
public class LocalDateTimeToZonedDateTimeConverter implements Converter<LocalDateTime, ZonedDateTime> {
@Override
public ZonedDateTime convert(LocalDateTime source) {
return source.atZone(ZoneId.systemDefault());
}
}
class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory {
abstract static class DateConvertingAuditableBeanWrapper implements AuditableBeanWrapper {
private final ConversionService conversionService;
}
}
是否可以審核ZonedDateTime
字段?
如何注冊轉換器?
創建DateTimeProvider
以提供審計時使用的當前時間:
@Component("dateTimeProvider")
public class CustomDateTimeProvider implements DateTimeProvider {
@Override
public Optional<TemporalAccessor> getNow() {
return Optional.of(ZonedDateTime.now());
}
}
接着:
@EnableMongoAuditing
注釋中引用DateTimeProvider
組件; Date
和ZonedDateTime
創建Converter
; Converter
實例添加到MongoCustomConversions
實例; MongoCustomConversions
實例公開為@Bean
。 @Configuration
@EnableMongoAuditing(dateTimeProviderRef = "dateTimeProvider")
public class MongoConfiguration {
@Bean
public MongoCustomConversions customConversions() {
List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(new DateToZonedDateTimeConverter());
converters.add(new ZonedDateTimeToDateConverter());
return new MongoCustomConversions(converters);
}
class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {
@Override
public ZonedDateTime convert(Date source) {
return source == null ? null :
ZonedDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault());
}
}
class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {
@Override
public Date convert(ZonedDateTime source) {
return source == null ? null : Date.from(source.toInstant());
}
}
}
但是,我不會為此目的使用ZonedDateTime
。 我會堅持OffsetDateTime
:
OffsetDateTime
,ZonedDateTime
和Instant
都會在時間線上存儲一個納秒精度的瞬間。 即時是最簡單的,只是代表瞬間。OffsetDateTime
將UTC / Greenwich的偏移量添加到瞬間,從而可以獲得本地日期時間。ZonedDateTime
添加了完整的時區規則。
ZonedDateTime
或Instant
用於在更簡單的應用程序中建模數據。 在更詳細地建模日期時間概念時,或者在與數據庫或網絡協議進行通信時,可以使用此類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.