2016-08-19 12 views
0

私はSpringデータMongoDBでSpring Cloud Brixton.SR4を使用しています。Spring Mongodb - java.time.Periodのカスタムコンバータを書き込めません。

私は非常に単純なエンティティがあります。java.time.Periodjsr310によってサポートされていないので、私は、カスタムコンバーターを作成してい

@Document 
public class Foo{ 
    private Period period; 

    //getter & setter 
} 

を:

class Converters { 
    @Component 
    @WritingConverter 
    static class PeriodToStringConverter implements Converter<Period, String> { 
     @Override 
     public String convert(Period period) { 
      return period.toString(); 
     } 
    } 

    @ReadingConverter 
    @Component 
    static class StringToPeriodConverter implements Converter<String, Period> { 

     @Override 
     public Period convert(String s) { 
      return Period.parse(s); 
     } 
    } 

今私はAbstractMongoConfigurationを拡張し、私の設定クラスに登録:

@Bean 
    @Override 
    public MappingMongoConverter mappingMongoConverter() throws Exception { 
     DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); 
     MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()); 
     final CustomConversions conversions = customConversions(); 
     log.info("hasCustomWriteTarget(Period.class): " + conversions.hasCustomWriteTarget(Period.class)); 
     log.info("hasCustomWriteTarget(Period.class, String.class): " + conversions.hasCustomWriteTarget(Period.class, String.class)); 
     log.info("hasCustomReadTarget(String.class, Period.class): " + conversions.hasCustomReadTarget(String.class, Period.class)); 
     converter.setCustomConversions(conversions); 
     converter.afterPropertiesSet(); //probably not needed, trying out of despair 
     return converter; 
    } 

    @Bean 
    @Override 
    public CustomConversions customConversions() { 
     List<Converter> converters = new ArrayList<>(); 
     converters.add(new Converters.PeriodToStringConverter()); 
     converters.add(new Converters.StringToPeriodConverter()); 
     return new CustomConversions(converters); 
    } 

私は私のアプリを起動すると、私がログに表示さ:

hasCustomWriteTarget(Period.class): true 
hasCustomWriteTarget(Period.class, String.class): true 
hasCustomReadTarget(String.class, Period.class): true 

今、私は新しいFooを作成して、私のリポジトリに保存します。

Foo foo = new Foo(); 
foo.setPeriod(Period.of(2, 0, 1)); 
fooRepository.save(foo); 

今、おかしなことが起こります。MongoDBので

を私は参照してください:

{ 
    "_id": ObjectId("xxxx"), 
    "period": { 
     "years" : 0, 
     "months" : 2, 
     "days" : 1 
    } 
} 

これはすでに間違っています。私のオブジェクトが格納されていなかったため

if (conversions.hasCustomReadTarget(dbo.getClass(), rawType)) { 
     return conversionService.convert(dbo, rawType); 
    } 

:私はMappingMongoConverterのコードをデバッグ

org.springframework.data.mapping.model.MappingException: No property null found on entity class java.time.Period to bind constructor parameter to! 

:私はJavaでオブジェクトを読み取るしようとすると、私は取得String

として保存する必要があります文字列としてdboは実際にはBasicDbObjectなので、私はこのためのコンバータを持っていません。

私の書き込みコンバータがPeriodを保持するために使用されていない理由は何ですか?

私のクラスパスにはjackson-datatype-jdk8がありますが、それは問題になりますか?ジャックソンはモンゴブで永続するためにまったく関与するだろうか?

EDIT

登録の問題のようです。コードをデバッグすると、MappingMongoConverterで使用されているCustomConversionオブジェクトが、私が作成するオブジェクトとは異なります。基本的に私のカスタムコンバータを無視

@Bean 
public MongoTemplate mongoTemplate() throws Exception { 
    return new MongoTemplate(mongoDbFactory()); 
} 

:そして、それは私がまたMongoTemplate私自身が作成していた、それは非常に愚かだった

答えて

1

OK ...

を作成するカスタムコンバータを持っていません。修正するには:

@Bean 
public MongoTemplate mongoTemplate() throws Exception { 
    return new MongoTemplate(mongoDbFactory(), mappingMongoConverter()); 
} 
関連する問題