Sono bloccato alla conversione di Java Bean
in Map
. Ci sono molte risorse su Internet, ma sfortunatamente trattano tutti la conversione di bean semplici in Maps. I miei sono un po 'più ampi.Appiattimento del bean Java su una mappa
C'è esempio semplificato:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
Il mio punto è quello di produrre Map<String, Object>
che, in questo caso, è vero per seguenti condizioni:
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")
Ho provato con Apache Commons BeanUtils
. Entrambi gli approcci BeanUtils#describe(Object)
e BeanMap(Object)
producono una mappa che "livello profondo" è 1 (intendo che è presente solo la chiave "homeAddress"
, contenente l'oggetto MyHomeAddress
come valore). Il mio metodo dovrebbe inserire gli oggetti sempre più in profondità fino a quando non incontra un tipo primitivo (o String), quindi dovrebbe smettere di scavare e inserire la chiave, ovvero "order.customer.contactInfo.home"
.
Quindi, la mia domanda è: come può essere fatto facilmente (o esiste già un progetto che mi consenta di farlo)?
aggiornamento
ho ampliato Radiodef risposta per includere anche collezioni, Mappe array e enumerazioni:
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;
}
Probabilmente non si intende "primitivo", poiché 'String' non è un primitivo (estende' Object'). Quindi ti serve un modo per dire all'algoritmo quali classi attraversare e quali prendere come valori, quindi probabilmente non ci sarà un modo per farlo senza una sorta di configurazione (magari usando le annotazioni). – Tonio
Questo può essere fatto con la riflessione e la ricorsione, quasi sicuramente devi scriverlo da solo. Nota che al momento la domanda verrà chiusa perché chiedere consigli per le biblioteche è fuori tema. – Radiodef
Tonio, Radiodef - grazie per i vostri suggerimenti, ho modificato il mio post. –