私自身の質問に答えます。コメントで述べたように、解決策はConverter
を使用することです 。
これが私のクラスモデルで達成しようとしたことの例です:
Contact
Person
のいずれかになります またはOrganisation
。
spring-data-mongodbを使用している場合_class
に従ってデータベースにデータを書き込むには フィールドは、ドキュメントのルートと複雑なプロパティタイプに追加されます(このセクションを参照
)。このフィールドには、Javaクラスの完全修飾名が格納され、MongoDbドキュメントからSpringデータモデルにマッピングするときに曖昧さを解消できます。
アプリがデータベースからドキュメントを読み取るだけの場合(_class
はありません) フィールド)、Contact
をマッピングするときにインスタンス化するクラスをSpringデータに指示する必要があります 。 Spring-dataを使用すると、Converter
を使用してデフォルトの型マッピング動作をカスタマイズできます 。明示的なConverter
の使用 デフォルトをオーバーライドクラスのマッピング
。クラス全体を明示的にマップする必要があります。これが私のContactReadConverterの例です :
@ReadingConverter
public class ContactReadConverter implements Converter<Document, Contact> {
@Override
public Contact convert(Document source) {
if (source.get("firstName") == null) {
Organisation organisation = new Organisation();
I18n name = new I18n();
name.setEn(source.get("name", Document.class).get("en", String.class));
name.setFr(source.get("name", Document.class).get("fr", String.class));
organisation.setName(name);
organisation.setAcronym(source.get("acronym", String.class));
organisation.setRole(source.get("role", String.class));
return organisation;
}
Person person = new Person();
person.setFirstName(source.get("firstName", String.class));
person.setLastName(source.get("lastName", String.class));
person.setRole(source.get("role", String.class));
person.setEmail(source.get("email", String.class));
person.setOrcId(source.get("orcId", String.class));
if (source.get("organisation") != null) {
Document sourceOrg = source.get("organisation", Document.class);
Organisation organisation = new Organisation();
organisation.setAcronym(sourceOrg.get("acronym", String.class));
organisation.setRole(sourceOrg.get("role", String.class));
if (sourceOrg.get("name") != null) {
I18n name = new I18n();
name.setFr(sourceOrg.get("name", Document.class).get("fr", String.class));
name.setEn(sourceOrg.get("name", Document.class).get("en", String.class));
organisation.setName(name);
}
person.setOrganisation(organisation);
}
return person;
}
}
次に、新しく定義されたコンバーターを登録する必要があります:
@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {
@Value("${spring.data.mongodb.uri}")
private String uri;
@Value("${spring.data.mongodb.database}")
private String database;
@Override
public MongoClient mongoClient() {
return new MongoClient(new MongoClientURI(uri));
}
@Override
protected String getDatabaseName() {
return database;
}
@Bean
@Override
public MongoCustomConversions customConversions() {
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new ContactReadConverter());
return new MongoCustomConversions(converterList);
}
}
お役に立てば幸いです。