Image

Imagekamen_jahr wrote in Imageru_java

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


 (на ночь глядя не точно изьяснился). Мне не надо стринговое представление (я нарочно не "строка" написал, а "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 По подказке Imageivan_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(testModesBean1, values);

        Object testModesBean2 = beanGen.create();

        values = new Object[] { Mode.TWO, Mode.TWO };
        bulkBeanClass.setPropertyValues(testModesBean2, values);

        BeanItemContainer containerT = new BeanItemContainer(testModesBean1.getClass());
        containerT.addBean(testModesBean1);
        containerT.addBean(testModesBean2);
---
table.setContainerDataSource(containerT);
...


Upd. 3 и про рефлекцию в используемом VAADIN:В VAADIN при работе с бинами применяется "сановско-оракловская" рефлекция В частности , 

в следующих классах

  ----
  com.vaadin.data.util.AbstractBeanContainer
  .....
    /**
     * 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<BEANTYPE>) 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;
    }