Ich versuche, einen Mapper zu entwerfen, die einen Objekttyp in einer anderen in der Abbildung unten gezeigt konvertieren:Map-Objekttypen mit benutzerdefinierten Konverter
Die Objektstruktur hat wie folgt (es ist kein JSON):
{
"type": "DownloadAppComponent",
"name": "Download App",
"contentId": "download-app",
"properties": {
"iosUrl": "http://apple.com",
"androidUrl": "http: //google.com",
"promoText": "Download our app",
"hidden": false
}
Meine erste Lösung war Mapper für jeden Typ zu haben, aber das ist eine Menge von Code-Duplizierung erforderlich gemeinsame Attribute (zB Name, Typ, contentId) abzubilden.
public DownloadAppComponent map(CmsDocument cmsDocument) {
DownloadAppComponent downloadAppComponent = new DownloadAppComponent();
downloadAppComponent.setType(cmsDocument.getType()); // <-- this will be duplicated in each mapper
downloadAppComponent.setName(cmsDocument.getName()); // <-- this will be duplicated in each mapper
downloadAppComponent.setContentId(cmsDocument.getText(CONTENT_ID_PATH)); // <-- this will be duplicated in each mapper
downloadAppComponent.setIosURL(cmsDocument.getText(IOS_URL_PATH));
downloadAppComponent.setAndroidURL(cmsDocument.getText(ANDROID_URL_PATH));
downloadAppComponent.setHidden(Boolean.parseBoolean(cmsDocument.getText(HIDE_PATH)));
downloadAppComponent.setPromoText(cmsDocument.getText(DOWNLOAD_PROMO_TEXT_PATH));
return downloadAppComponent;
}
Ich habe versucht, diesen Code zu Refactoring und ich komme mit generic BaseDocumentMapper:
public BaseDocument map(CmsDocument cmsDocument) {
BaseDocument document = documentsMapperFactory.getMapper(cmsDocument.getType()).map(cmsDocument);
document.setType(cmsDocument.getType());
document.setName(cmsDocument.getName());
document.setContentId(cmsDocument.getText(CONTENT_ID_PATH));
return document;
}
Die documentsMapperFactory
kehrt spezifischen Mapper, die nur Typ bezogene Attribute abbildet und zurück, dass die Objektinstanz.
Allerdings gibt es noch mehr Ebenen in der Vererbung und ich habe nur einen Typ Wert, den ich in konkrete Mapper auflösen kann. Also muss ich die Zuordnung spezifischer Komponenten in jedem Komponenten-Mapper wiederholen. Ich dachte, dass ich, da ich die Hierarchie kenne, einige Mapper erstellen könnte, die die Dokumente von oben nach unten abbilden würden, d. H. Zuerst DownloadAppComponent erstellen und dann mit Component und dann mit BaseDocument-spezifischen Eigenschaften erweitern. Ich habe jedoch keine gute Lösung gefunden, außer abstrakte Klassen und Vererbung in Mappern zu verwenden.
Könnte mir jemand sagen, ob dies ein guter Ansatz ist oder ob es Probleme oder andere bessere Lösungen für meinen Fall gibt?
Vielen Dank.
Nun, ich würde zuerst versuchen, vorhandene Bibliotheken zu verwenden, wie http://dozer.sourceforge.net/. – Tom