私はSpringデータMongoDBでSpring Cloud Brixton.SR4
を使用しています。Spring Mongodb - java.time.Periodのカスタムコンバータを書き込めません。
私は非常に単純なエンティティがあります。java.time.Period
はjsr310
によってサポートされていないので、私は、カスタムコンバーターを作成してい
@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
私自身が作成していた、それは非常に愚かだった