Java Bean со списком объектов - трансформация в row-объект
Есть Java Bean со списком объектов, например, со enum списком.
Напр. такой
===
public class Bean {
pirvate List<Mode> modes
// settter & getter
}
===
enum - такой
//
public enum Mode{ONE, TWO}
===
Каким образом конвертироватьм его в row объект??
Т.е чтобы представление вида было
|ONE|TWO|
Upd.0
Upd.1
мне нужен POJO поля которого сгенерированы из элементов списка изначального бина:
возвращаясь к примеру:
public class Bean {
pirvate List<Mode> modes
public Bean() {
modes = new ArrayList();}
// settter & getter
}
инстациируем бин:
Bean myBean = new Bean();
инициализируем его:
myBean.getModes().add(Mode.ONE);
myBean.getModes().add(Mode.TWO);
Теперь наш бин содержит список, который в свою очередь состоит из двух элементов.
А теперь хотелось бы "конвертировать" этот бин в POJO следующего вида:
MyPojo {
private Mode mode1=Mode.ONE;
private Mode mode2=Mode.TWO;
// Setter & Getter
}
Расширим пример;-))
Представим, что бин содержит НЕ список с энумами, А список с другими бинами (nestedBeans):
public class ExtendedBean {
private List<OtherBean> nestedBeans
}
А теперь хотелось бы "конвертировать" этот бин в POJO следующего вида:
OtherPojo {
private OtherBean otherBean1;
private OtherBean otherBean2;
...
private OtherBean otherBeanN;// где N - размер списка nestedBeans.
}
Upd. 2 По подказке
ivan_gammel
Использовал cglib с учетом необходимых библиотек http://cglib.sourceforge.net/dependencies.html. В тырнете прочел, что от него отказались в хайбернейте. (2010 год)
Kind of knew people would ask about this... So why did we decide to deprecate CGLIB support in Hibernate? First I want to point out that Hibernate and CGLIB have a very long history (and a largely good history) in terms of working together. This is not an indictment against any of the CGLIB developers. They are good guys and as I stated above for many years Hibernate and CGLIB have worked well together.
The simple fact of the matter is that development on CGLIB has largely stopped. It happens. Developers for whatever reason (the reasons are their own) move on to new priorities.
Но на данный момент cglib библиотеки - "свежие" - 2012 года. После генерации бина для контейнера бинов на основе списка со значениями энума таблица выглядит вот так (я еще добавил комбобокс). в TableFieldFactory. Ах да;-)) я использую VAADIN.
Фрагменты кода касаемо генерации -
под катом
...
public enum Mode {
ONE, TWO
}
public class Bean {
List<Mode> modes;
public Bean() {
modes = new ArrayList<>();
}
}
...
// test reflection & bean
Bean commonBean = new Bean();
commonBean.modes.add(Mode.ONE);
commonBean.modes.add(Mode.TWO);
BeanGenerator beanGen = new BeanGenerator();
String[] getters = new String[commonBean.modes.size()];
String[] setters = new String[commonBean.modes.size()];
Class[] types = new Class[commonBean.modes.size()];
Object[] values = new Object[commonBean.modes.size()];
for (int i = 0; i < commonBean.modes.size(); i++) {
String fieldName = "Mode" + i;// to avoid cAapitalize for getTers/setTers.
beanGen.addProperty(fieldName, Mode.class);
getters[i] = "get" + fieldName;
setters[i] = "set" + fieldName;
types[i] = Mode.class;
values[i] = commonBean.modes.get(i);
}
Object testModesBean1 = beanGen.create();
BulkBean bulkBeanClass = BulkBean.create(testModesBean1.getClass( ), getters, setters, types);
bulkBeanClass.setPropertyValues(testMod esBean1, values);
Object testModesBean2 = beanGen.create();
values = new Object[] { Mode.TWO, Mode.TWO };
bulkBeanClass.setPropertyValues(testMod esBean2, values);
BeanItemContainer containerT = new BeanItemContainer(testModesBean1.getClas s());
containerT.addBean(testModesBean1);
containerT.addBean(testModesBean2);
---
table.setContainerDataSource(containerT) ;
...
Upd. 3 и про рефлекцию в используемом VAADIN:В VAADIN при работе с бинами применяется "сановско-оракловская" рефлекция В частности ,
в следующих классах
----
com.vaadin.data.util.AbstractBeanContain er
.....
/**
* Constructs a {@code AbstractBeanContainer} for beans of the given type.
*
* @param type
* the type of the beans that will be added to the container.
* @throws IllegalArgumentException
* If {@code type} is null
*/
protected AbstractBeanContainer(Class<? super BEANTYPE> type) {
if (type == null) {
throw new IllegalArgumentException(
"The bean type passed to AbstractBeanContainer must not be null");
}
this.type = type;
model = BeanItem.getPropertyDescriptors((Class<B EANTYPE>) type);
----
com.vaadin.data.util.BeanItem
...
static <BT> LinkedHashMap<String, VaadinPropertyDescriptor<BT>> getPropertyDescriptors(
final Class<BT> beanClass) {
final LinkedHashMap<String, VaadinPropertyDescriptor<BT>> pdMap = new LinkedHashMap<String, VaadinPropertyDescriptor<BT>>();
// Try to introspect, if it fails, we just have an empty Item
try {
List<PropertyDescriptor> propertyDescriptors = getBeanPropertyDescriptor(beanClass);
// Add all the bean properties as MethodProperties to this Item
// later entries on the list overwrite earlier ones
for (PropertyDescriptor pd : propertyDescriptors) {
final Method getMethod = pd.getReadMethod();
if ((getMethod != null)
&& getMethod.getDeclaringClass() != Object.class) {
VaadinPropertyDescriptor<BT> vaadinPropertyDescriptor = new MethodPropertyDescriptor(
pd.getName(), pd.getPropertyType(),
pd.getReadMethod(), pd.getWriteMethod());
pdMap.put(pd.getName(), vaadinPropertyDescriptor);
}
}
} catch (final java.beans.IntrospectionException ignored) {
}
return pdMap;
}
Напр. такой
===
public class Bean {
pirvate List<Mode> modes
// settter & getter
}
===
enum - такой
//
public enum Mode{ONE, TWO}
===
Каким образом конвертироватьм его в row объект??
Т.е чтобы представление вида было
|ONE|TWO|
Upd.0
(на ночь глядя не точно изьяснился). Мне не надо стринговое представление (я нарочно не "строка" написал, а "row-объект).
Подробнее рассказываю:
есть бин, содержащий список атрибутов. Каждый из аттрибутов списка должен быть представителем столбца таблицы. В совокупности инстанция бина - это строка в таблице.
Спасиб за советыUpd.1
мне нужен POJO поля которого сгенерированы из элементов списка изначального бина:
возвращаясь к примеру:
public class Bean {
pirvate List<Mode> modes
public Bean() {
modes = new ArrayList();}
// settter & getter
}
инстациируем бин:
Bean myBean = new Bean();
инициализируем его:
myBean.getModes().add(Mode.ONE);
myBean.getModes().add(Mode.TWO);
Теперь наш бин содержит список, который в свою очередь состоит из двух элементов.
А теперь хотелось бы "конвертировать" этот бин в POJO следующего вида:
MyPojo {
private Mode mode1=Mode.ONE;
private Mode mode2=Mode.TWO;
// Setter & Getter
}
Расширим пример;-))
Представим, что бин содержит НЕ список с энумами, А список с другими бинами (nestedBeans):
public class ExtendedBean {
private List<OtherBean> nestedBeans
}
А теперь хотелось бы "конвертировать" этот бин в POJO следующего вида:
OtherPojo {
private OtherBean otherBean1;
private OtherBean otherBean2;
...
private OtherBean otherBeanN;// где N - размер списка nestedBeans.
}
Upd. 2 По подказке
Использовал cglib с учетом необходимых библиотек http://cglib.sourceforge.net/dependencies.html. В тырнете прочел, что от него отказались в хайбернейте. (2010 год)
Kind of knew people would ask about this... So why did we decide to deprecate CGLIB support in Hibernate? First I want to point out that Hibernate and CGLIB have a very long history (and a largely good history) in terms of working together. This is not an indictment against any of the CGLIB developers. They are good guys and as I stated above for many years Hibernate and CGLIB have worked well together.
The simple fact of the matter is that development on CGLIB has largely stopped. It happens. Developers for whatever reason (the reasons are their own) move on to new priorities.
Но на данный момент cglib библиотеки - "свежие" - 2012 года. После генерации бина для контейнера бинов на основе списка со значениями энума таблица выглядит вот так (я еще добавил комбобокс). в TableFieldFactory. Ах да;-)) я использую VAADIN.
Фрагменты кода касаемо генерации -
под катом
...
public enum Mode {
ONE, TWO
}
public class Bean {
List<Mode> modes;
public Bean() {
modes = new ArrayList<>();
}
}
...
// test reflection & bean
Bean commonBean = new Bean();
commonBean.modes.add(Mode.ONE);
commonBean.modes.add(Mode.TWO);
BeanGenerator beanGen = new BeanGenerator();
String[] getters = new String[commonBean.modes.size()];
String[] setters = new String[commonBean.modes.size()];
Class[] types = new Class[commonBean.modes.size()];
Object[] values = new Object[commonBean.modes.size()];
for (int i = 0; i < commonBean.modes.size(); i++) {
String fieldName = "Mode" + i;// to avoid cAapitalize for getTers/setTers.
beanGen.addProperty(fieldName, Mode.class);
getters[i] = "get" + fieldName;
setters[i] = "set" + fieldName;
types[i] = Mode.class;
values[i] = commonBean.modes.get(i);
}
Object testModesBean1 = beanGen.create();
BulkBean bulkBeanClass = BulkBean.create(testModesBean1.getClass(
bulkBeanClass.setPropertyValues(testMod
Object testModesBean2 = beanGen.create();
values = new Object[] { Mode.TWO, Mode.TWO };
bulkBeanClass.setPropertyValues(testMod
BeanItemContainer containerT = new BeanItemContainer(testModesBean1.getClas
containerT.addBean(testModesBean1);
containerT.addBean(testModesBean2);
---
table.setContainerDataSource(containerT)
...
Upd. 3 и про рефлекцию в используемом VAADIN:В VAADIN при работе с бинами применяется "сановско-оракловская" рефлекция В частности ,
в следующих классах
----
com.vaadin.data.util.AbstractBeanContain
.....
/**
* Constructs a {@code AbstractBeanContainer} for beans of the given type.
*
* @param type
* the type of the beans that will be added to the container.
* @throws IllegalArgumentException
* If {@code type} is null
*/
protected AbstractBeanContainer(Class<? super BEANTYPE> type) {
if (type == null) {
throw new IllegalArgumentException(
"The bean type passed to AbstractBeanContainer must not be null");
}
this.type = type;
model = BeanItem.getPropertyDescriptors((Class<B
----
com.vaadin.data.util.BeanItem
...
static <BT> LinkedHashMap<String, VaadinPropertyDescriptor<BT>> getPropertyDescriptors(
final Class<BT> beanClass) {
final LinkedHashMap<String, VaadinPropertyDescriptor<BT>> pdMap = new LinkedHashMap<String, VaadinPropertyDescriptor<BT>>();
// Try to introspect, if it fails, we just have an empty Item
try {
List<PropertyDescriptor> propertyDescriptors = getBeanPropertyDescriptor(beanClass);
// Add all the bean properties as MethodProperties to this Item
// later entries on the list overwrite earlier ones
for (PropertyDescriptor pd : propertyDescriptors) {
final Method getMethod = pd.getReadMethod();
if ((getMethod != null)
&& getMethod.getDeclaringClass() != Object.class) {
VaadinPropertyDescriptor<BT> vaadinPropertyDescriptor = new MethodPropertyDescriptor(
pd.getName(), pd.getPropertyType(),
pd.getReadMethod(), pd.getWriteMethod());
pdMap.put(pd.getName(), vaadinPropertyDescriptor);
}
}
} catch (final java.beans.IntrospectionException ignored) {
}
return pdMap;
}
