簡體   English   中英

在Spring Data MongoDB for ZonedDateTime中注冊一個可審計的新Date Converter

[英]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.0Spring Data MongoDB 2.0.0

Spring Data審核錯誤:

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].

Mongo配置:

@Configuration
@EnableMongoAuditing
public class MongoConfiguration {

}

可審計實體:

public abstract class BaseDocument {

    @CreatedDate
    private ZonedDateTime createdDate;

    @LastModifiedDate
    private ZonedDateTime lastModifiedDate;

}

我試過的事情

我也嘗試為ZonedDateTime創建自定義轉換器,但Spring Data不考慮它。 DateConvertingAuditableBeanWrapper具有ConversionService其在與所述構造方法構造JodaTimeConvertersJsr310ConvertersThreeTenBackPortConverters

定制轉換器:

@Component
public class LocalDateTimeToZonedDateTimeConverter implements Converter<LocalDateTime, ZonedDateTime> {

    @Override
    public ZonedDateTime convert(LocalDateTime source) {
        return source.atZone(ZoneId.systemDefault());
    }

}

Spring Data DateConvertingAuditableBeanWrapper:

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

接着:

@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

OffsetDateTimeZonedDateTimeInstant都會在時間線上存儲一個納秒精度的瞬間。 即時是最簡單的,只是代表瞬間。 OffsetDateTime將UTC / Greenwich的偏移量添加到瞬間,從而可以獲得本地日期時間。 ZonedDateTime添加了完整的時區規則。

ZonedDateTimeInstant用於在更簡單的應用程序中建模數據。 在更詳細地建模日期時間概念時,或者在與數據庫或網絡協議進行通信時,可以使用此類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM