Ich bin bei Java Bean
-Map
Umwandlung fest. Es gibt viele Ressourcen im Internet, aber leider behandeln alle das Konvertieren einfacher Beans nach Maps. Meine sind ein bisschen umfangreicher.Abflachen Java Bean auf eine Karte
Es gibt vereinfachtes Beispiel:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
Mein Punkt ist Map<String, Object>
herzustellen, die in diesem Fall für die folgenden Bedingungen erfüllt ist:
map.containsKey("firstName")
map.containsKey("lastName")
map.containsKey("homeAddress.street") // street is String
map.containsKey("homeAddress.number") // number is int
map.containsKey("homeAddress.city") // city is String
map.containsKey("homeAddress.zipcode") // zipcode is String
map.containsKey("age")
Ich habe versucht, Apache Commons BeanUtils
verwenden. Beide Ansätze BeanUtils#describe(Object)
und BeanMap(Object)
erzeugen eine Karte, deren "tiefes Niveau" 1 ist (ich meine, dass es nur "homeAddress"
Schlüssel gibt, die MyHomeAddress
Objekt als Wert halten). Meine Methode sollte die Objekte tiefer und tiefer eingeben, bis sie einen primitiven Typ (oder String) treffen, dann sollte sie aufhören zu graben und einen Schlüssel, d. H. "order.customer.contactInfo.home"
, einfügen.
Also, meine Frage ist: Wie kann es leicht erlaufen (oder gibt es bereits bestehendes Projekt, das mir, das zu tun erlauben würde) getan werden?
Update
Ich habe Radiodef erweitert Antwort auch Sammlungen, Karten Arrays und Aufzählungen enthalten:
private static boolean isValue(Object value) {
final Class<?> clazz = value.getClass();
if (value == null ||
valueClasses.contains(clazz) ||
Collection.class.isAssignableFrom(clazz) ||
Map.class.isAssignableFrom(clazz) ||
value.getClass().isArray() ||
value.getClass().isEnum()) {
return true;
}
return false;
}
Wahrscheinlich meinst du nicht "primitiv", da 'String' kein primitives Element ist (es erweitert' Object'). Sie benötigen also eine Möglichkeit, dem Algorithmus mitzuteilen, welche Klassen durchlaufen werden sollen und welche Werte als Werte verwendet werden sollen. Daher wird es wahrscheinlich keine Möglichkeit geben, dies ohne irgendeine Art von Konfiguration zu tun (möglicherweise unter Verwendung von Anmerkungen). – Tonio
Dies kann mit Reflektion und Rekursion gemacht werden, Sie müssen es fast sicher selbst schreiben. Beachten Sie, dass die Frage im Moment geschlossen wird, da die Abfrage von Bibliotheksempfehlungen nicht in der Liste enthalten ist. – Radiodef
Tonio, Radiodef - danke für deine Vorschläge, ich habe meinen Post bearbeitet. –