Я застрял при преобразовании Java Bean
в Map
. В Интернете много ресурсов, но, к сожалению, все они рассматривают преобразование простых бобы в Карты. Мои немного более обширны.Свертывание Java Bean к карте
Там же упрощенный пример:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
Моя точка производить Map<String, Object>
, которые, в данном случае, верно для следующих условий:
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")
Я попытался с помощью Apache Commons BeanUtils
. Оба подхода BeanUtils#describe(Object)
и BeanMap(Object)
создают карту, для которой «глубокий уровень» равен 1 (я имею в виду, что есть только "homeAddress"
ключ, содержащий MyHomeAddress
объект в качестве значения). Мой метод должен вводить объекты глубже и глубже, пока не встретит примитивный тип (или String), тогда он должен прекратить копать и вставлять ключ, то есть "order.customer.contactInfo.home"
.
Итак, мой вопрос: как он может быть выполнен easliy (или есть уже существующий проект, который позволил бы мне это сделать)?
обновление
Я расширил Radiodef ответ включает также коллекцию, Карты Массивы и перечисления:
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;
}
Вы, вероятно, не имеете в виду «примитивный», поскольку «String» не является примитивным (он расширяет «Object»). Таким образом, вам нужен способ рассказать алгоритму, какие классы должны проходить, и какие значения принимать значения, поэтому, вероятно, не будет способа сделать это без какой-либо конфигурации (возможно, с помощью аннотаций). – Tonio
Это можно сделать с отражением и рекурсией, вы почти наверняка должны написать это самостоятельно. Обратите внимание, что на данный момент вопрос будет закрыт, потому что запрос рекомендаций библиотеки не соответствует теме. – Radiodef
Tonio, Radiodef - спасибо за ваши предложения, я редактировал свой пост. –