Tôi sẽ trả lời câu hỏi của riêng tôi. Như đã đề cập trong các nhận xét, giải pháp là sử dụng Converter
.
Dưới đây là một ví dụ về những gì tôi dự định đạt được với mô hình lớp của mình:
Một Contact
có thể là một Person
hoặc một Organisation
.
Nếu bạn đang sử dụng spring-data-mongodb MongoRepository
để ghi dữ liệu vào cơ sở dữ liệu của bạn theo mô hình thực thể của bạn, một _class
trường sẽ được thêm vào gốc tài liệu và vào các loại thuộc tính phức tạp (xem phần này
). Các trường này lưu trữ tên đủ điều kiện của lớp Java và nó cho phép định vị khi ánh xạ từ Tài liệu MongoDb sang mô hình dữ liệu Spring.
Nếu ứng dụng của bạn chỉ đọc tài liệu từ cơ sở dữ liệu (không có _class
các trường), bạn cần cho dữ liệu Spring biết lớp nào cần khởi tạo khi ánh xạ một Contact
. Spring-data cho phép bạn tùy chỉnh hành vi ánh xạ loại mặc định bằng cách sử dụng Converter
. Sử dụng Converter
rõ ràng ghi đè mặc định ánh xạ cho lớp học
. bạn cần lập bản đồ rõ ràng cho toàn bộ lớp của mình. Đây là ví dụ về ContactReadConverter của tôi :
@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;
}
}
Sau đó, các bộ chuyển đổi mới được xác định cần phải được đăng ký:
@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);
}
}
Hy vọng nó sẽ hữu ích.