13

Java 8 の日付/時刻フィールドを持つ単純なドキュメントがあります

@Document
public class Token {
    private Instant createdAt;
    ...
}

Spring Data MongoDB バージョン 1.5 で永続化したいと考えています。しかし、クラスのコンバーターがないため、型のフィールドをjava.time.Instant正しく逆シリアル化できませんでした。MappingMongoConverterjava.time

org.springframework.format.datetime.standard.DateTimeConvertersSpring 4 では、さまざまなConverters を含むことがわかりInstantToLongConverterLongToInstantConverterプライベートな静的クラスとして宣言されました。

それらを使用してフィールドを longMongoTemplateにマップするように構成するにはどうすればよいですか?Instant

4

2 に答える 2

15

これが最善の方法かどうかはわかりませんが、Java 8 Date/Time (JSR-310) 型のサポートを1.5.0.RELEASE次のように Spring Data MongoDB に追加しました。

  1. 最初の一歩。シンプルな Spring を追加Converterする

    public class InstantToLongConverter implements Converter<Instant, Long> {
        @Override
        public Long convert(Instant instant) {
            return instant.toEpochMilli();
        }
    }
    
    public class LongToInstantConverter implements Converter<Long, Instant> {
        @Override
        public Instant convert(Long source) {
            return Instant.ofEpochMilli(source);
        }
    }
    
    public class LocalDateToStringConverter implements Converter<LocalDate, String> {
        @Override
        public String convert(LocalDate localDate) {
            return localDate.toString();
        }
    }
    
    public class StringToLocalDateConverter implements Converter<String, LocalDate> {
        @Override
        public LocalDate convert(String source) {
            return LocalDate.parse(source);
        }
    }
    
  2. 第二段階。これらのカスタムConverterを次のように実装に登録MappingMongoConverterします。AbstractMongoConfiguration

    @Configuration
    @EnableMongoRepositories(basePackages = {"my.app.repository"})
    public class MongoConfiguration extends AbstractMongoConfiguration {
    
        ...
    
        @Override
        public CustomConversions customConversions() {
            return new CustomConversions(Arrays.asList(
                    new InstantToLongConverter(), new LongToInstantConverter(),
                    new LocalDateToStringConverter(), new StringToLocalDateConverter()));
        }
    }
    

これで、ドキュメントのInstantフィールドは long 値として永続化され、LocalDates は文字列として永続化されます。

于 2014-06-01T17:57:43.353 に答える
3

@ user882209はそれをすべて完璧に説明しました。
Spring Data MongoDB 1.7 以降、JSR-310 のサポートが追加されました。
アプリケーションが Spring Boot によってサポートされている場合、1.2.8 を超えるすべてのバージョンにもそれが含まれます。
Spring Boot-ed アプリでは、次のように実行できます。

@Configuration
public class MongoDbConfig {

    @Autowired
    private MongoDbFactory mongoDbFactory;

    @Bean
    public MongoTemplate mongoTemplate() {
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory),
            new MongoMappingContext());
        converter.setCustomConversions(new CustomConversions(Arrays.asList(...)));

    return new MongoTemplate(mongoDbFactory, converter);
    }
}

次のコンバーターがJsr310Convertersクラスによって提供されます。
DateToLocalDateTimeConverter - LocalDateTimeToDateConverter DateToLocalDateConverter - LocalDateToDateConverter DateToLocalTimeConverter - LocalTimeToDateConverter DateToInstantConverter - InstantToDateConverter

于 2016-02-01T17:48:40.763 に答える