Utknąłem przy konwersji Java Bean
na Map
. Istnieje wiele zasobów w Internecie, ale niestety wszystkie one traktują konwersję prostych komponentów do Map. Moje są nieco bardziej rozległe.Spłaszczanie ziarna Javy na mapie
Jest uproszczony przykład:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
Chodzi mi o to, aby produkować Map<String, Object>
, które w tym przypadku odnosi się do następujących warunków:
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")
Próbowałem, używając Apache Commons BeanUtils
. Oba podejścia podają BeanUtils#describe(Object)
i BeanMap(Object)
wytwarzają Mapę, której "głęboki poziom" wynosi 1 (to znaczy, że istnieje tylko klucz "homeAddress"
, trzymający obiekt MyHomeAddress
jako wartość). Moja metoda powinna wejść do obiektów głębiej i głębiej, dopóki nie napotka podstawowego typu (lub ciągu), a następnie powinna przestać kopać i wstawiać klucz, tj. "order.customer.contactInfo.home"
.
Moje pytanie brzmi: jak można to łatwo zrobić (czy jest już istniejący projekt, który pozwoli mi to zrobić)?
aktualizacja
I Rozszerzyliśmy Radiodef odpowiedź na to także kolekcje, mapy tablice i wyliczenia:
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;
}
Prawdopodobnie nie masz na myśli "prymitywnego", ponieważ 'String' nie jest prymitywny (rozszerza' Object'). Więc potrzebujesz sposobu, aby powiedzieć algorytmowi, które klasy przechodzić i które przyjmować jako wartości, więc prawdopodobnie nie będzie sposobu, aby to zrobić bez jakiejś konfiguracji (może za pomocą adnotacji). – Tonio
Można tego dokonać za pomocą refleksji i rekursji, prawie na pewno trzeba to napisać samemu. Zwróć uwagę, że w tej chwili pytanie zostanie zamknięte, ponieważ prośba o rekomendacje biblioteki nie jest tematem. – Radiodef
Tonio, Radiodef - dziękuję za sugestie, zredagowałem mój post. –